我今天注意到这样的定义

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定义为!国际海事组织,这似乎足以证明禁止此类条款的合理性。

08-25 23:27