这个问题本质上是使用GHCi调试Haskell程序中的无限循环的重复问题。作者手动解决了这个问题,但我想知道其他的解决方案。
很奇怪的是,在常见的地方插入 "trace" 调用(比如函数组合),程序会发出有限数量的输出,然后冻结。这不是我从无限项扩展问题中期望得到的结果。(请参见编辑1)
如果有人感兴趣,我已经上传了我的源代码在这里。
然后一切正常运作。我想现在是时候尝试学习和使用garrows(由伯克利的研究生开发)了。
我的总体感受是,ghci调试可能会令人沮丧。例如,我设法将
(我的具体问题)
我有一个包含递归调用的箭头代码。
testAVFunctor = proc x -> do
y <- errorArrow "good error" -< x
z <- isError -< y
(passError ||| testAVFunctor) -< trace "value of z" z
errorArrow
应该使递归的 testAVFunctor 不执行,因为这会导致 isError 返回一个 Left (AVError "good error")
,进而选择 passError
路线并绕过递归调用。很奇怪的是,在常见的地方插入 "trace" 调用(比如函数组合),程序会发出有限数量的输出,然后冻结。这不是我从无限项扩展问题中期望得到的结果。(请参见编辑1)
如果有人感兴趣,我已经上传了我的源代码在这里。
编辑 1
我没有看对地方(如果你想查看源代码,请注意,显然 avEither 在循环)。我找到它的方法是通过编译二进制文件,然后运行 gdb:- gdb Main
- r (运行代码)
- Ctrl+C (发送中断信号)。回溯将毫无用处,但您可以做的是按下
- s (步进)。然后,按住回车键;您应该会看到很多方法名飞过。希望其中一个是可识别的。
-O0
进行编译以禁用优化,这可以显示更多的方法名称。
编辑 3
显然,上面的proc x -> do
块导致代码生成组合器,这些组合器调用了 AVFunctor.arr
提升方法 -- 其中的某些内容必须违反了惰性。如果我将顶层函数重写为:testAVFunctor = errorArrow "good error" >>>
isError >>> (passError ||| testAVFunctor)
然后一切正常运作。我想现在是时候尝试学习和使用garrows(由伯克利的研究生开发)了。
我的总体感受是,ghci调试可能会令人沮丧。例如,我设法将
AVFunctor.arr
的参数f
显示为本地变量,但我无法从中获得任何有用的信息:> :i f
f :: b -> c -- <no location info>
修改后的源代码在这里
。
ghc -O0 --make Main.hs
,然后运行gdb Main
,并执行r
、ctrl+c
和s
,如上所述。您将看到类似于此处的内容,http://pastebin.com/xSJ9uMn3 。 - gatoatigrado