Prelude> fact n = n * fact (n-1)
Prelude> fact 0 = 1
Prelude> fact 3
*** Exception: <interactive>:6:1-10: Non-exhaustive patterns in function fact
Prelude> :q
Leaving GHCi.
bash> ghci
Prelude> fact 0 = 1
Prelude> fact n = n * fact (n-1)
Prelude> fact 3
*** Exception: stack overflow
Что происходит?
С GHC определение first приведет к переполнению стека, а второе будет правильным.
Нов GHCi каждая привязка shadows предыдущая с таким же именем.В приведенном выше примере в каждой из сессий каждая строка, содержащая уравнение для fact
, является полным определением.Когда вызывается fact 3
, действует только вторая строка, а первая невидима.
Таким образом, вы не можете определять функции так же, как в обычном GHC.
Для правильного определения факториальной функции вы можете использовать один из этих трех методов.
Определение в скобках без макета.
Prelude> let { fact 0 = 1; fact n = n * fact(n-1) }
Многострочное определение со специальными скобками GHCi.
Prelude> :{
Prelude| let fact 0 = 1
Prelude| fact n = n * fact (n-1)
Prelude| :}
Многострочное определение без специальных скобок (необходимо :set +m
, которое можно добавить к вашему ~/.ghci
)
Prelude> let fact 0 = 1
Ptelude| fact n = n * fact (n-1)
Prelude|
Prelude>
См. Руководство для дополнительной информации.
Примечание. Я использовал let
в этих определениях, потому что я к ним привык, но в новых версиях они на самом деле не нужныGHCi.