如何使用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
会增加分析频率以尝试捕获溢出操作(发生得非常快)。
这产生了这个相当无益的情节:
这个情节没有明显的溢出。 y轴甚至不超过一兆字节!我在这里做错了什么?