我正在尝试Haskell 99问题,而我的第一个尝试就是这个问题。尽管解决方案可能有点不正确,但我只想知道为什么Haskell对第一个问题发出警告并输出错误的结果

> let { mylast (x:xs) = mylast xs; mylast [] = 0 ;mylast [x] = x;}
Pattern match(es) are overlapped

> mylast [1,2,3,58,8,6,1,231,10]
> 0

但是下面的代码执行得很好。
> let { mylast [] = 0 ;mylast [x] = x;mylast (x:xs) = mylast xs;}
> mylast [1,2,3,58,8,6,1,231,10]
> 10

最佳答案

是的,将以指定的顺序尝试函数定义中的模式,并且(仅)使用第一条匹配行。

所以在你的定义

mylast (x:xs) = mylast xs
mylast [] = 0
mylast [x] = x

(为清晰起见,已重新格式化),非空列表将始终由第一行处理,甚至包括列表[x](带有x=xxs=[])。因此,您对mylast的计算将愉快地忽略列表中的每个元素,最后查看[],从而返回0

10-08 05:11