我有以下功能来获得矩阵的力量
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语句的情况下重写此函数?
答案 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)
然而,这并不简洁,也不能更好地传达您的功能对读者的影响。所以不要这样做,除非你真的讨厌条件。