haskell矩阵功率,不使用if-else语句

时间:2014-01-16 03:09:58

标签: haskell matrix linear-algebra

我有以下功能来获得矩阵的力量

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语句的情况下重写此函数?

2 个答案:

答案 0 :(得分:4)

是的,你可以使用警卫。但它经常会在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)

答案 1 :(得分: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)

然而,这并不简洁,也不能更好地传达您的功能对读者的影响。所以不要这样做,除非你真的讨厌条件。