2009-09-01 14 views
2

私はいくつかの宿題をしています。私はSMLに関するいくつかの経験がありますが、ハスケルは幾分奇妙です。この簡単な関数を考えてみましょう:ハスケル関数のパターンマッチング問題

type Pos = (Int, Int) 
data Move = North | South | East | West 
move :: Move -> Pos -> Pos 
move North (x,y) = (x, y+1) 
move South (x,y) = (x, y-1) 
move East (x,y) = (x+1, y) 
move West (x,y) = (x-1, y) 

moves :: [Move] -> Pos -> Pos 
moves (m:ms) (x,y) = moves ms (move m (x,y)) 
moves [] p = p 

このコードは機能します。私はそれが呼び出しに失敗したシンプルなp(x,y)タプルを(私はとにかく使いいけないもの)スワップアウトした場合ただし、(宣言はもちろん正常に動作します):2番目のパラメータとして、私には奇妙に思える

moves :: [Move] -> Pos -> Pos 
moves (m:ms) p = moves ms (move m p) 
moves [] p = p 

*Main> let p = (1,1) :: Pos 
*Main> move [North, North] p 

<interactive>:1:5: 
    Couldn't match expected type `Move' against inferred type `[a]' 
    In the first argument of `move', namely `[North, North]' 
    In the expression: move [North, North] p 
    In the definition of `it': it = move [North, North] p 

すでに定義のPosとしてタイプされているので、どのようにこのチョークが発生し、呼び出し時のみですか?私はghci btwを使用しています。

+0

「移動」は「移動」と綴られています。 – jrockway

答えて

5

移動終了時に "s"を忘れてしまったコールしましたか?

*Main> move [North, North] p 
+0

はい、彼はしました。彼は「動き」を期待していたときに、タイプ[a]のものを渡しました。そして驚くべきことに、それはまさにエラーメッセージが言うことです。 – jrockway