haskell - Haskell 对函数定义中的顺序敏感吗?

标签 haskell

我正在尝试 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 .

关于haskell - Haskell 对函数定义中的顺序敏感吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29961513/

相关文章:

haskell - 如何让线条和圆一样粗?

monads - 将 Show 实例添加到 RWH 的 RandomState 示例

haskell - 将默认值替换为另一个默认值 Haskell

haskell - runDb 中的 MaybeT 和事务

haskell - Haskell 中常见的 monad 对应的伴随仿函数对是什么?

haskell - 在 Nvidia Jetson TK1(ARM 架构)上安装 haskell 平台

haskell - 检查 Haskell 程序本身的内存和 CPU 使用情况

Haskell - 简单的构造函数比较(?)函数

haskell 。 WAI 简单 Web 应用程序出现问题(解压字节串)

algorithm - 为什么我的 Miller Rabin 算法不起作用(Haskell)?