2014-01-16 1 views
3

I는 행렬의 전력을 획득하기 위해 다음 함수가하스켈 행렬 전력 사용하지 IF-else 문

X^0 = 행렬, X = X^1;
X^2 = X'X;
X^3 = XX'X;
X^4 = X 'X X'X ...... 나는 다음과 같은 기능을 시도

다음의 경우-else 문을 사용하지 않고이 기능을 다시 작성

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) 

이 가능합니까?

+0

기본적으로''\ x y -> trans x''tMultiply'''' (또는 tranposition과 multiplication을 결합한 최적화 된 버전)을 취하면 기본적으로 오른쪽으로 재귀 할 수는 없습니까? – leftaroundabout

답변

4

예, 경비원을 사용할 수 있습니다. 그러나 꽤 자주 하스켈에서 같은 내부 표현으로 컴파일됩니다. freyrs가 언급 한 바와 같이

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) 
+0

이 답변은 정말 분명합니다. 감사합니다. –

1

, 경비 및 문은 당신이 당신의 코드를 컴파일 할 때 모두 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) 

그러나,이보다 간결 아니며, 더 나은 당신의 기능은 독자에게 무엇을하고 있는지 통신 않습니다. 그러니 당신이 정말로 증오 조건을 제외하고는 이것을하지 마십시오.