来自Ocaml社区,我正在尝试学习一些Haskell.过渡进展顺利,但我对调试有点困惑.我曾经在我的ocaml代码中放置(很多)"printf",检查一些中间值,或者作为标志来查看计算完全失败的位置.
由于printf是一个IO动作,我是否必须解除IO monad中的所有haskell代码才能进行这种调试?或者有更好的方法来做到这一点(如果可以避免,我真的不想手工做)
我也找到了跟踪功能:http: //www.haskell.org/haskellwiki/Debugging#Printf_and_friends 这看起来正是我想要的,但我不明白它的类型:任何地方都没有IO!有人能解释一下跟踪功能的行为吗?
如何获得有关Haskell错误发生位置的更多信息?例如,昨天我正在研究一个Haskell程序,它解析输入文件,转换数据然后打印出报告信息.
有一次,我跑了"主"并回来了
*** Prelude.read: parse error
Run Code Online (Sandbox Code Playgroud)
没有其他信息.幸运的是,我知道我只是在一个地方打电话阅读并且能够修复它,但对于未来:
谢谢!
使用GHC 编辑.
我正在寻找替换loch(及其预处理器)的东西,因为它不能用ghc 7编译.
具体来说,如果error被调用,那么我想尽可能方便地找出调用它的位置(行号和堆栈跟踪会很好).
我有一个Haskell程序,它Data.Map.!在几个地方使用.执行程序后,会显示错误消息element not in the map.我想知道我怎么知道使用Data.Map.!发出错误消息的程序的哪一行以及在地图中找不到哪个元素?
我无法弄清楚我的代码中正在引发什么函数,(*** Exception: Prelude.!!: negative index因为此异常对于错误的描述性不是很好。有什么方法可以准确检测正在调用的自定义函数!!并引发此错误。
这是调用时错误的一个简单的可重现示例index_around 0 [1, 2, 3],这里的异常文本没有描述异常是由函数引发index_before还是由index_after函数引发。
index_before :: Int -> [a] -> a
index_before i list = list !! (i - 1)
index_after :: Int -> [a] -> a
index_after i list = list !! (i + 1)
index_around :: Int -> [a] -> (a, a)
index_around i list = (index_before i list, index_after i list)
Run Code Online (Sandbox Code Playgroud) 为了练习Haskell,我实现了Fermat的分解方法(参见https://en.wikipedia.org/wiki/Fermat%27s_factorization_method).但是,当我运行我的程序时,Haskell一直告诉我:
$ ./fermat 7
fermat: <<loop>>
Run Code Online (Sandbox Code Playgroud)
所以看来,我的代码中存在无限循环(cmp.http ://www.haskell.org/pipermail/haskell-cafe/2013-June/108826.html).任何人都可以给我一个提示,我做错了什么?
另外我想扩展一下如何调试Haskell代码的问题?有关如何调试此特定异常的提示.
import Data.List
import System.Environment
import Debug.Trace
isQuad :: Integer -> Bool
isQuad x = a == b
where
a = ceiling $ s
b = floor $ s
s = sqrt (fromIntegral x :: Double)
test :: Integer -> Integer -> Integer -> Bool
test nr n s = trace(show nr ++ " " ++ show n ++ " " ++ show s)
isQuad( …Run Code Online (Sandbox Code Playgroud)