【发布时间】:2019-06-29 03:31:52
【问题描述】:
函数签名明确指出它应该返回一个 Bool 那么为什么函数返回 96?更重要的是,编译器认为 96 实际上是一个 Bool。这是一个错误吗?
> isLeapYear year =\
| (modBy 4 year == 0) && (modBy 100 year /= 0) || (modBy 400 year == 0)
<function> : Int -> Bool
> isLeapYear 1996
96 : Bool
虽然有时它似乎有效:
> isLeapYear 2000
True : Bool
> isLeapYear 1800
False : Bool
【问题讨论】:
-
是的,它看起来确实像一个错误,我可以使用
/=运算符对任一侧的0进行复制。例如,1 /= 0和0 /= 1都产生1 : Bool而1 /= 2产生预期的True : Bool -
可能是一个 repl 错误而不是编译器错误。我怀疑在实际编译的代码中这样的问题会被忽视这么久。
-
这是编译代码中的问题,只需通过将其打印到 webapp 中进行检查。它也在
elm-test输出中。 -
Here is an Ellie example that shows this is a bug in compiled code。它打印两个布尔值列表,第一个修改为 0 并显示整数而不是布尔值,第二个列表修改为 1 并适当地显示布尔值。我敢打赌这个问题涉及
Debug.print,因为它不只是在 REPL 中。
标签: boolean elm compiler-bug