Haskell - 在if块中调试打印

JDL*_*aha 9 debugging haskell

我想通过打印来调试我的程序

例如,

isPos n 
    | n<0       = False
    | otherwise = True
Run Code Online (Sandbox Code Playgroud)

我想要的东西:

isPos n 
    | n<0       = False AND print ("negative")
    | otherwise = True  AND print ("positive")
Run Code Online (Sandbox Code Playgroud)

在Haskell可以做到吗?

bet*_*eta 18

正如hammar所说,traceDebug.Trace模块中使用.我发现有用的提示是定义函数debug:

debug = flip trace
Run Code Online (Sandbox Code Playgroud)

那你可以做

isPos n
  | n < 0     = False `debug` "negative"
  | otherwise = True  `debug` "positive"
Run Code Online (Sandbox Code Playgroud)

这样做的好处是在开发过程中很容易启用/禁用调试打印.要删除调试打印,只需注释掉其余部分:

isPos n
  | n < 0     = False -- `debug` "negative"
  | otherwise = True  -- `debug` "positive"
Run Code Online (Sandbox Code Playgroud)

  • 我经常发现变量`debug =(flip trace)False很有用.如果我有一个基于防护的函数定义,我只需插入一个(或多个)`| debug("有趣的值是"++显示任何东西)= undefined`作为第一个警卫.跟踪始终运行,但由于`debug x`始终为'False`,因此保护总是失败并且程序正常运行.这使得快速检查值变得容易,至少在已经具有防护装置的功能中. (8认同)

ham*_*mar 15

使用Debug.Trace.trace.

import Debug.Trace

isPos n 
  | n < 0     = trace "negative" False
  | otherwise = trace "positive" True 
Run Code Online (Sandbox Code Playgroud)