Haskell函数模式匹配问题

Haskell函数模式匹配问题,haskell,Haskell,我正在做一些家庭作业,虽然我对SML有一些经验,但Haskell有一些奇怪之处。考虑这个简单函数: 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

我正在做一些家庭作业,虽然我对SML有一些经验,但Haskell有一些奇怪之处。考虑这个简单函数:

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)
元组(我无论如何都不使用),调用时就会失败(声明当然可以):

Move::[Move]->Pos->Pos
移动(m:ms)p=移动ms(移动m p)
移动[]p=p
*Main>let p=(1,1)::Pos
*Main>move[North,North]p
:1:5:
无法将预期类型“Move”与推断类型“[a]”匹配
在“move”的第一个参数中,即“[North,North]”
在表达式中:move[North,North]p
在“it”的定义中:it=move[North,North]p
这对我来说似乎很奇怪,因为第二个参数在定义中已经被输入为Pos,那么为什么这个参数会阻塞,并且只在调用时阻塞呢?顺便说一句,我正在使用ghci。

你在移动s通话结束时忘记了一个“s”,是吗

*Main> move [North, North] p

你把“移动”拼写为“移动”。是的,他拼写了。他把[a]型的东西递给了move,当时它正期待着“move”。令人惊讶的是,这正是错误信息所说的。
*Main> move [North, North] p