我有以下函数来获取矩阵的幂
X^0 = 单位矩阵,X^1 =X;
X^2 = X'X;
X^3 = X X' X;
X^4 =
我尝试使用以下功能:
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)
但是,这并不更简洁,也不能更好地向读者传达您的函数正在执行的操作。所以不要这样做,除非你真的讨厌条件。