我今天注意到这样的定义
safeDivide x 0 = x
safeDivide = (/)
不可能。我很好奇这背后的(好的)原因是什么。必须有一个非常好的(毕竟是Haskell :)。
注意:我不是在寻找上述代码的替代实现的建议,这只是一个简单的例子来说明我的观点。
最佳答案
我认为这主要是为了保持一致性,以便可以以相同的方式读取所有子句。也就是说,每个RHS在功能类型中都位于同一位置。如果您允许的话,我认为也会掩盖很多愚蠢的错误。
还有一个语义上的怪癖:说编译器填充了这些子句,使其具有与其他子句相同数量的模式;即您的示例将成为
safeDivide x 0 = x
safeDivide x y = (/) x y
现在考虑第二行是否改为
safeDivide = undefined
;在没有上一个子句的情况下,safeDivide
将是⊥
,但是由于此处执行了eta扩展,因此它是\x y -> if y == 0 then x else ⊥
,因此safeDivide = undefined
实际上并未将safeDivide
定义为⊥
!国际海事组织,这似乎足以证明禁止此类条款的合理性。