【发布时间】:2015-03-23 06:36:24
【问题描述】:
我写了以下代码:
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 的类型在第一次调用后被某种方式修改了。当从main 多次调用it 时,事情变得更加奇怪,即所有调用都返回预期结果,但最终() 被分配为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”。
【问题讨论】: