gpt4 book ai didi

haskell - 删除 GHCI 中定义的函数

转载 作者:行者123 更新时间:2023-12-02 14:54:39 25 4
gpt4 key购买 nike

我开始学习 haskell 并发现自己不得不一次又一次地重新启动 repl,因为我为函数定义了不正确的特化并且我不知道如何删除它们。

例如,假设我错误地将 n == 0 的基本情况放在阶乘函数的一般情况之后:

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

这显然是错误的,现在如果我重复一般情况,它将被添加到当前列表中,为我提供 3 个 fact 重载。

如何删除我定义的第一个案例,或者如果可能的话删除 fact 的所有定义。是否可以删除我在 GHCI 中定义的函数?如果是,如何?

最佳答案

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,第一个 定义会导致堆栈溢出,而第二个定义是正确的。

但在 GHCi 中,每个绑定(bind) shadows 前一个具有相同名称的绑定(bind)。在上面的示例中,在每个 session 中,包含 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>

参见 manual了解更多信息。

请注意,我在这些定义中使用了 let,因为我已经习惯了它们,但实际上在较新版本的 GHCi 中不需要它们。

关于haskell - 删除 GHCI 中定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53552152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com