Elm возвращает целое число вместо Bool, ошибка компилятора?

В сигнатуре функции четко указано, что она должна возвращать 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

person frost    schedule 05.02.2019    source источник
comment
Да, это определенно похоже на ошибку, и я могу воспроизвести ее, используя оператор /= против 0 с обеих сторон. Например, 1 /= 0 и 0 /= 1 дают 1 : Bool, а 1 /= 2 дают ожидаемое True : Bool.   -  person Chad Gilbert    schedule 05.02.2019
comment
Вероятно, ошибка repl, а не ошибка компилятора. Я сомневаюсь, что подобная проблема в реальном скомпилированном коде так долго оставалась бы незамеченной.   -  person glennsl    schedule 05.02.2019
comment
Это проблема в скомпилированном коде, который только что проверил, распечатав его в веб-приложении. Он также находится в выводе elm-test.   -  person frost    schedule 05.02.2019
comment
Вот пример Элли, который показывает, что это ошибка в скомпилированном коде. Он печатает два списка логических значений, первый из которых изменяется на 0 и показывает целое число вместо логического значения, а второй список изменяется на 1 и показывает логическое значение соответствующим образом. Могу поспорить, что проблема связана с Debug.print, поскольку она не только в REPL.   -  person Chad Gilbert    schedule 05.02.2019


Ответы (1)


Это ошибка компилятора, о которой я сообщил в прошлом году и которая теперь исправлена.

Это влияет только на оператор /=, когда один аргумент равен 0: замена (modBy 100 year /= 0) на (not (modBy 100 year == 0)) решит проблему.

Ошибка была исправлена ​​в исходном репозитории, но я не знаю, когда выйдет исправление.

person Luke Woodward    schedule 05.02.2019