如何在Haskell中调试无限递归?

时间:2015-06-07 01:20:04

标签: debugging haskell profiling

如何使用GHC的分析工具调试这个(显然)有缺陷的程序?程序在frobnicate的第二个子句中输入无限递归。

-- Foo.hs
frobnicate :: Show a => Maybe a -> String
frobnicate Nothing = ""
frobnicate x       = case frobnicate x of
  "" -> "X"
  _  -> show x

main :: IO ()
main = print (frobnicate (Just "" :: Maybe String))

这个例子可能看起来很人为,但它实际上剥夺了我今天遇到的真正错误的版本。

在命令式语言中,错误很明显,因为堆栈跟踪会说frobnicate -> frobnicate -> frobnicate -> ...之类的东西。但是如何在Haskell中发现这一点呢? 如何缩小对这一特定功能的责任呢?

我尝试了类似于以下内容的内容:

ghc -fforce-recomp -rtsopts -prof -fprof-auto Foo.hs
./Foo +RTS -M250M -i0.001 -h
hp2ps -c Foo.hp

其中添加-M250M标志以确保它不会终止计算机,-i0.001会增加分析频率以尝试捕获溢出操作(发生得非常快)。

这产生了这个相当无益的情节:

enter image description here

这个情节没有明显的溢出。 y轴甚至不超过一兆字节!我在这里做错了什么?

0 个答案:

没有答案