Debugging Haskell中的无限递归

Debugging Haskell中的无限递归,debugging,haskell,infinite-loop,ghci,arrows,Debugging,Haskell,Infinite Loop,Ghci,Arrows,这个问题本质上是重复的作者在那里手动解决了这个问题,不过我想知道其他解决方案 (我的特殊问题) 我有一个包含递归调用的箭头代码 testAVFunctor = proc x -> do y <- errorArrow "good error" -< x z <- isError -< y (passError ||| testAVFunctor) -< trace "value of z" z 然后一切正常。我想是时候尝试学习和使用了

这个问题本质上是重复的作者在那里手动解决了这个问题,不过我想知道其他解决方案

(我的特殊问题) 我有一个包含递归调用的箭头代码

testAVFunctor = proc x -> do
    y <- errorArrow "good error" -< x
    z <- isError -< y
    (passError ||| testAVFunctor) -< trace "value of z" z
然后一切正常。我想是时候尝试学习和使用了(伯克利的一名研究生)

我的经验告诉我,ghci调试可能会令人沮丧。例如,我成功地使
AVFunctor.arr
的参数
f
显示为局部变量,但我无法从中获得任何信息:

> :i f
f :: b -> c     -- <no location info>
:if
f::b->c--

修改后的源代码是

请记住,
(| | |)的含义
取决于箭头,而
testAVFunctor
是箭头的无限对象:

testAVFunctor = proc x -> do
    ...
    (passError ||| proc x -> do
                       ...
                       (passError ||| proc x -> ...) -< trace "value of z" z)
        -< trace "value of z" z
testAVFunctor=proc x->do
...
(过路人| | |程序x->do
...
(passError | | | proc x->…)-<跟踪z的“值”
-
我不确定你是否意识到这一点。检查
(| | | |)的定义
(如果没有定义,则检查左侧的
是否可以处理无限项。还要检查
(>>>)
(呃,
(。
,我想是现代版本的)。确保组合子不是严格的,因为这样一个无限项就会发散。这可能需要使用
~
(我在使用箭头时经常这样做)。您所看到的行为可能是由其中一个组合器中的过于严格导致的,因此它的计算结果“足够远”,可以给出一些输出,但随后会被卡住


祝你好运。你已经进入了哈斯克尔的深邃微妙之中。

谢谢,我需要它:)。我正在检查;它可能在那里的某个地方。我在一个更简单的例子中使用了
~
,非常幸运,谢谢!在链接的重复问题上,作者手动解决了它,其他在那里发表评论的用户询问了问题的来源。所以,我开始问这个问题。我当然调试它,并将更新这个页面,因为我发现更多。如果有人知道自动技术,我会非常感激——我是一个haskell新手。嗯,我以为gdb不能与ghc一起工作,因为你看不到真正的堆栈跟踪,但你可以看到一些方法名称。对于本例,下载原始的AVFunctor.zip(编辑部分之前的链接),然后运行
ghc-O0--make Main.hs
,然后运行
gdb Main
,以及
r
ctrl+c
s
,如上所述。你会看到这样的东西。
testAVFunctor = proc x -> do
    ...
    (passError ||| proc x -> do
                       ...
                       (passError ||| proc x -> ...) -< trace "value of z" z)
        -< trace "value of z" z