質問

I have the following function to obtain power of a matrix

X^0 = identity matrix, X^1 =X;
X^2 = X'X;
X^3 = X X' X;
X^4 = X' X X' X ......

I tried with following function:

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)

Is it possible to rewrite this function without using the if-else statement ?

役に立ちましたか?

解決

Yes, you could use guards. But quite often it will compile into the same internal representation in 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)

他のヒント

As freyrs mentioned, guards and if statements are exactly equivalent as they are both converted to case of when you compile your code. But, you can still get rid of them:

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)

However, this isn't more concise, nor does it better communicate what your function is doing to the reader. So don't do this, unless you really hate conditionals.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top