haskell中的调试循环

haskell中的调试循环,haskell,Haskell,假设我在Haskell中有以下代码: x :: Int y :: Int z :: Int x=y y=z z=x 当然,如果使用ghc,引用这些变量中的任何一个都会导致执行以爆炸,如果使用ghci,则会导致执行无限旋转。我正在编写一些代码,如果代码错误,可能会出现循环-有什么方法可以调试-我可以在堆栈爆炸时检查堆栈以查看循环吗?我查看了@TheInternet linked,第一个答案的建议是使用-fbreak on exception-fbreak on error和:trace非常好。然

假设我在Haskell中有以下代码:

x :: Int
y :: Int
z :: Int
x=y
y=z
z=x
当然,如果使用ghc,引用这些变量中的任何一个都会导致执行以
爆炸,如果使用ghci,则会导致执行无限旋转。我正在编写一些代码,如果代码错误,可能会出现循环-有什么方法可以调试
-我可以在堆栈爆炸时检查堆栈以查看循环吗?

我查看了@TheInternet linked,第一个答案的建议是使用
-fbreak on exception
-fbreak on error
:trace
非常好。然而,我想我应该提到我遇到的两个小障碍,它们是针对这个问题的:

  • GHCi不会产生
    异常,只有本机编译的GHC会产生异常,并且GHCi调试器无法跟踪本机编译的代码
  • 幸运的是,按
    ^C
    手动中断可以解决此问题

  • 尝试
    :跟踪
    ,然后手动执行
    ^C
    ,这会提供一个调试器会话,但GHCi没有插入任何断点,因此没有要调试的上下文 这也很容易解决:我只是将第一个等式改为
    x=id y
    。这足以让GHCi插入断点。我怀疑这个问题是由于OP的代码周期只包含琐碎的变量方程(引用:“单个变量通常不被认为是断点位置(除非变量是函数定义、lambda或case替换的右侧)”),并且它通常不会发生在“实”代码中