2017-02-26 10 views
1

ハノイの塔の再帰関数を実装しようとしています。ハノイの塔を実装するときのHaskellエラー

アルゴリズムは次のとおりです。

Move n−1 disks from peg AA to peg C using peg B as intermediate storage. 

Move the nth disk from peg A to peg B, 

Move n−1 disks from peg C to peg BB using peg A as intermediate storage. 

Eample:

hanoi 2 "a" "b" "c" = 
[("a","c"), ("a","b"), ("c","b")] 

これは私の実装

hanoi :: Integer -> Peg -> Peg -> Peg -> [Move] 

hanoi x "a" "b" "c" 
    | x <= 0 = [] 
    | x == 1 = [("a", "b")] 
    | otherwise = (hanoi (x-1) "a" "c" "b") ++ [("a", "b")] ++ (hanoi (x-1) "c" "b" "a") 

である私はエラーを得たがthere is un-exhausted patternと述べました。 どうすれば解決できますか?

+1

引数を引用符で囲む必要はありません。ここで、彼らはすべきではありません。 –

答えて

1

Haskell関数の引数は、実際には、指定された値が一致するパターンです。

aは常に"a""b""c"または完全に何か他のものかどうかを、指定された値と変数aを照合することによって成功して反論できないパターンです。

"a"もパターンですが、それはのみマッチング値、"a"とマッチングするとき成功します:場合は、だから、

~> let f "a" = 1 
f :: Num a => [Char] -> a 

~> f "a" 
1 
it :: Num a => a 

~> f "c" 
*** Exception: <interactive>:3:5-13: Non-exhaustive patterns in function f 

関数を定義するときに、引用符であなたの引数を囲みません。それらを可変パターンとして解釈したいとします。

+0

ありがとうございます。これは本当に役に立ちます。 – RunningPig

関連する問題