GHCi 中的奇怪行为
Strange behaviour in GHCi
我写了下面这段代码:
it :: Int -> Int
it n
| n < 1 = error "Invalid entry."
| n == 1 = 0
| otherwise = 1 + it (n `quot` 2)
当我将它加载到 GHCi 中时,发生了一些奇怪的事情。我第一次调用函数 it
时,它工作正常并且 return 是预期的结果。然而,下一次,我遇到了以下崩溃:
λ: :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
的类型在第一次调用后以某种方式被修改。当从 main
多次调用 it
时,事情变得更加奇怪,即所有调用 return 预期结果,但最终 ()
被分配为 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
的输出是 "version 7.6.3".
命名运气不好:it
是GHCi自动绑定你之前评估结果的名字,方便你再次参考。因此,您的第一次使用会立即重新绑定它,从而影响您的定义。
如果在模块中定义了 it
,您应该仍然可以使用模块前缀从 GHCi 可靠地引用它,例如Main.it
.
我写了下面这段代码:
it :: Int -> Int
it n
| n < 1 = error "Invalid entry."
| n == 1 = 0
| otherwise = 1 + it (n `quot` 2)
当我将它加载到 GHCi 中时,发生了一些奇怪的事情。我第一次调用函数 it
时,它工作正常并且 return 是预期的结果。然而,下一次,我遇到了以下崩溃:
λ: :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
的类型在第一次调用后以某种方式被修改。当从 main
多次调用 it
时,事情变得更加奇怪,即所有调用 return 预期结果,但最终 ()
被分配为 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
的输出是 "version 7.6.3".
命名运气不好:it
是GHCi自动绑定你之前评估结果的名字,方便你再次参考。因此,您的第一次使用会立即重新绑定它,从而影响您的定义。
如果在模块中定义了 it
,您应该仍然可以使用模块前缀从 GHCi 可靠地引用它,例如Main.it
.