Haskell矩阵幂而不使用if-else语句



我有以下函数来获取矩阵的幂

X^0 = 单位矩阵,X^1 =X;
X^2 = X'X;
X^3 = X X' X;
X^4 =

X' X X' X ......

我尝试使用以下功能:

import Numeric.Container
import Numeric.LinearAlgebra 
mpow :: Field t => (Matrix t) -> Integer -> (Matrix t) 
mpow x 0 = ident $ cols x 
mpow x 1 = x
mpow x n =
    if (mod n 2) == 0 then 
        multiply (trans x) (mpow x $ n - 1)
    else 
        multiply x (mpow x $ n - 1)

是否可以在不使用 if-else 语句的情况下重写此函数?

是的,你可以使用警卫。但很多时候,它会编译成 Haskell 中的相同内部表示。

import Numeric.Container
import Numeric.LinearAlgebra
mpow :: Field t => (Matrix t) -> Integer -> (Matrix t)
mpow x 0 = ident $ cols x
mpow x 1 = x
mpow x n | (mod n 2) == 0 = multiply (trans x) (mpow x $ n - 1)
         | otherwise      = multiply x (mpow x $ n - 1)

正如 freyrs 所提到的,guards 和 if 语句是完全等价的,因为它们在编译代码时都会转换为 case of。但是,您仍然可以摆脱它们:

mpow' :: Field t => (Matrix t) -> Integer -> (Matrix t) 
mpow' x 0 = ident $ cols x 
mpow' x 1 = x
mpow' x n = multiply (head (drop n' fs) $ x) (mpow' x $ n - 1)
    where fs = [trans, id]
          n' = fromInteger (mod n 2)

但是,这并不更简洁,也不能更好地向读者传达您的函数正在执行的操作。所以不要这样做,除非你真的讨厌条件。

相关内容

  • 没有找到相关文章

最新更新