我刚开始学习函数式编程,我的选择是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 = 100
ghci 相同的操作,之后它+
在所有表达式中使用了该定义而不是通常的定义.
您可能仍然想知道为什么会给出如此巨大的数字,我也是如此,直到我意识到第二点:重新定义(+)
也重新定义其优先级,默认值为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)