Удаление функции, определенной в GHCI - PullRequest
0 голосов
/ 30 ноября 2018

Я начинаю изучать haskell и снова и снова вынужден перезапускать repl, потому что я определил неправильную специализацию для функции и не знаю, как их удалить.

Например, давайтедопустим, я допустил ошибку, указав базовый случай n == 0 после общего случая для факториальной функции:

fact n = n * fact(n-1)
fact 0 = 1

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

Как удалить первый случай, который я определил, или все определения fact, если это возможно.Можно ли удалить функцию, которую я определил в GHCI?Если да, то как?

1 Ответ

0 голосов
/ 30 ноября 2018
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.

Для правильного определения факториальной функции вы можете использовать один из этих трех методов.

  1. Определение в скобках без макета.

    Prelude> let { fact 0 = 1; fact n = n * fact(n-1) }
    
  2. Многострочное определение со специальными скобками GHCi.

    Prelude> :{
    Prelude| let fact 0 = 1
    Prelude|     fact n = n * fact (n-1)
    Prelude| :}
    
  3. Многострочное определение без специальных скобок (необходимо :set +m, которое можно добавить к вашему ~/.ghci)

    Prelude> let fact 0 = 1 
    Ptelude|     fact n = n * fact (n-1)
    Prelude|
    Prelude>
    

См. Руководство для дополнительной информации.

Примечание. Я использовал let в этих определениях, потому что я к ним привык, но в новых версиях они на самом деле не нужныGHCi.

...