GHCi中的奇怪行为

时间:2015-03-23 06:36:24

标签: 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”。

1 个答案:

答案 0 :(得分:11)

命名运气不好:it是GHCi自动绑定到您之前评估结果的名称,以便您可以方便地再次参考。因此,您的第一次使用会立即重新绑定它,影响您的定义。

如果模块中定义了it,您仍然可以使用模块前缀从GHCi可靠地引用它,例如Main.it

相关问题