私はいくつかの宿題をしています。私は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を使用しています。
「移動」は「移動」と綴られています。 – jrockway