Haskell随机吐出错误的数字

Rmx*_*aha 6 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)]
Run Code Online (Sandbox Code Playgroud)

它应该是(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
Run Code Online (Sandbox Code Playgroud)

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

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

Ørj*_*sen 11

正如@BluePeppers建议的那样,正在发生的事情是你在某种程度上完成了与let a+b = 100ghci 相同的操作,之后它+在所有表达式中使用了该定义而不是通常的定义.

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

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]
Run Code Online (Sandbox Code Playgroud)

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^100^2 == c^2]
Run Code Online (Sandbox Code Playgroud)

3^2+5^2
Run Code Online (Sandbox Code Playgroud)

3^100^2
Run Code Online (Sandbox Code Playgroud)