相关疑难解决方法(0)

如何用printfs"调试"Haskell?

来自Ocaml社区,我正在尝试学习一些Haskell.过渡进展顺利,但我对调试有点困惑.我曾经在我的ocaml代码中放置(很多)"printf",检查一些中间值,或者作为标志来查看计算完全失败的位置.

由于printf是一个IO动作,我是否必须解除IO monad中的所有haskell代码才能进行这种调试?或者有更好的方法来做到这一点(如果可以避免,我真的不想手工做)

我也找到了跟踪功能:http: //www.haskell.org/haskellwiki/Debugging#Printf_and_friends 这看起来正是我想要的,但我不明白它的类型:任何地方都没有IO!有人能解释一下跟踪功能的行为吗?

debugging trace haskell printf-debugging

61
推荐指数
3
解决办法
9749
查看次数

跟踪Haskell中的错误

如何获得有关Haskell错误发生位置的更多信息?例如,昨天我正在研究一个Haskell程序,它解析输入文件,转换数据然后打印出报告信息.

有一次,我跑了"主"并回来了

*** Prelude.read: parse error
Run Code Online (Sandbox Code Playgroud)

没有其他信息.幸运的是,我知道我只是在一个地方打电话阅读并且能够修复它,但对于未来:

  • 是否有可能获得这些错误的回溯或行号?
  • 是否有可能获得触发错误的实际数据,即导致解析错误的字符串?

谢谢!

使用GHC 编辑.

haskell

14
推荐指数
2
解决办法
3421
查看次数

如何获得调用错误的位置?

我正在寻找替换loch(及其预处理器)的东西,因为它不能用ghc 7编译.

具体来说,如果error被调用,那么我想尽可能方便地找出调用它的位置(行号和堆栈跟踪会很好).

haskell

11
推荐指数
3
解决办法
2006
查看次数

使用Data.Map时如何知道哪个元素不在Map中.

我有一个Haskell程序,它Data.Map.!在几个地方使用.执行程序后,会显示错误消息element not in the map.我想知道我怎么知道使用Data.Map.!发出错误消息的程序的哪一行以及在地图中找不到哪个元素?

haskell

3
推荐指数
1
解决办法
558
查看次数

检测哪个函数引发异常 Prelude.!!:负索引

我无法弄清楚我的代码中正在引发什么函数,(*** 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 haskell-prelude

3
推荐指数
1
解决办法
258
查看次数

haskell:debugging << loop >>异常

为了练习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)

haskell

2
推荐指数
1
解决办法
316
查看次数