我刚开始学习函数式编程,我的选择是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版本可能已损坏?或者这是一个罕见的错误吗?
答案 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