Haskell随机吐出错误的数字

时间:2014-09-03 08:13:53

标签: haskell

我刚开始学习函数式编程,我的选择是haskell。 几天没事了,直到控制台发生了一些奇怪的事情

起初我认为教程(http://learnyouahaskell.com/starting-out)是错误的

Prelude> [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]  
[(1,1,1)]

应该是(3,4,5)(4,6,8)。 我试过3^2+5^2,它吐出了大量的数字(类似于60行数字,大约3000位数字); 4^2+3^2似乎产生了相同的数字。

尝试添加任何数字,结果将为100

Prelude> 100 + 200
100
Prelude> 300 + 500
100

我关闭窗口并重新打开它,问题就解决了。

这种错误计算经常发生在Haskell中吗?或者下载时我的Haskell版本可能已损坏?或者这是一个罕见的错误吗?

1 个答案:

答案 0 :(得分:11)

正如@BluePeppers建议的那样,正在发生的事情是,你在ghci中以某种方式完成了let a+b = 100的等效,之后它在所有表达式中使用了该定义而不是通常的+。 / p>

你可能仍然想知道为什么会给出如此巨大的数字,我也是如此,直到我意识到第二点:重新定义(+)还重新定义其优先级,默认为9(最高)。所以你的例子被解释为:

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]

变为

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^100^2 == c^2]

3^2+5^2

变为

3^100^2