haskell - GHCi 中的奇怪行为

标签 haskell ghci

我写了以下一段代码:

it :: Int -> Int
it n
    | n < 1     = error "Invalid entry."
    | n == 1    = 0
    | otherwise = 1 + it (n `quot` 2)

当我将它加载到 GHCi 中时,会发生一些奇怪的事情。第一次调用函数it ,它工作正常并返回预期结果。但是,下一次,我遇到以下崩溃:
λ: :t it
it :: Int -> Int
λ: it 2
1
λ: it 2

<interactive>:4:1:
    Couldn't match expected type `a0 -> t0' with actual type `Int'
    The function `it' is applied to one argument,
    but its type `Int' has none
    In the expression: it 2
    In an equation for `it': it = it 2
λ: :t it
it :: Int
λ: it
1

似乎 it 的类型在第一次通话后以某种方式进行了修改。当 it 时,事情变得更加奇怪从 main 多次调用,即所有调用都返回预期结果,但最终 ()被分配为 it 的类型:
main :: IO ()
main = do
    let r1 = it 1
        r2 = it 2
        r3 = it 3
    print r1
    print r2
    print r3

λ: main
0
1
1
λ: :t it
it :: ()

我相信这是一个与标识符 it 相关的错误。和 GHCi 内部,因为将函数重命名为其他名称(如 it' )完全解决了问题。除此之外,函数的主体似乎没有影响;做let it = (+) 2并且多次评估它也是有问题的。

任何见解将不胜感激。 ghci --version 的输出是“版本 7.6.3”。

最佳答案

命名倒霉:it是 GHCi 自动绑定(bind)到你之前的评估结果的名字,方便你再次引用。因此,您的第一次使用会立即重新绑定(bind)它,从而影响您的定义。

如果 it在模块中定义,您仍然应该能够从 GHCi 中使用模块前缀可靠地引用它,例如Main.it .

关于haskell - GHCi 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29204453/

相关文章:

haskell - 学习 Haskell 等纯函数式语言背后的理论的引用资料?

haskell - 如何在不同类型上进行模式匹配?

haskell - monadicIO 的工作原理

haskell - 有没有办法在递归深度或内存限制模式下运行 Haskell 控制台?

haskell - 如何在 GHCi 中从 "target list"删除模块

haskell - GHCi 中的多行命令

json - 是否可以使用 Text.JSON 在 haskell 中创建嵌套的 JSON 对象?

haskell - 我如何在这里使用箭头?

haskell - 有什么方法可以在 do/while/let block 中打印出变量类型?

Haskell:函数组合导致类型不匹配错误