【问题标题】:Elm returning integer instead of Bool, compiler bug?Elm 返回整数而不是 Bool,编译器错误?
【发布时间】: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 /= 00 /= 1 都产生 1 : Bool1 /= 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


【解决方案1】:

这是我去年提交的compiler bug,现在已修复。

当一个参数是0 时,它只影响/= 运算符:将(modBy 100 year /= 0) 替换为(not (modBy 100 year == 0)) 将解决此问题。

这个bug已经在源码库中修复了,但是不知道什么时候发布。

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 2015-12-08
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多