gpt4 book ai didi

Haskell 执行顺序

转载 作者:行者123 更新时间:2023-12-01 13:56:51 25 4
gpt4 key购买 nike

谁能帮我理解这段代码

solve s | s == 0 = Nothing
| s == 1 = Just 1
| otherwise =
check [solve (s-(x*2)) | x <- [1..9]]

check x = case x of
[] -> Nothing
(Nothing:xs) -> check xs
(x:xs) -> x

为什么当我尝试以偶数值运行它时这会导致堆栈溢出,并且在 haskell 中有什么方法可以调试并查看正在运行的程序的实际值,就像我们在 eclipse 中所做的那样?

谢谢

最佳答案

至少对于 GHCi,没有办法“单步执行”代码(编辑:不再正确,请参阅下面的评论),但您当然可以使用 Debug.Trace 添加调试语句.换句话说,如果你想检查所有对 solve 的递归调用,你可以说:

check [trace ("solving for " ++ show (s-(x*2)))) (solve (s-(x*2))) | x <- [1..9]]

有更简洁的方式来编写,但这只是说明了这个想法。

在这种特殊情况下,它无限递归的原因是永远不会达到 solve 的基本情况。 solve 2 例如,解析为 check [solve 0, solve -2, solve -4 ..., solve -16]solve -2 解析为 check [solve -4, solve -6, ...]

关于Haskell 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com