Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 打开/关闭调试消息的编译器开关?_Haskell_Ghc - Fatal编程技术网

Haskell 打开/关闭调试消息的编译器开关?

Haskell 打开/关闭调试消息的编译器开关?,haskell,ghc,Haskell,Ghc,好的,这里有一个简单的问题。我已经编写了一个函数debug::String->IO()。我想设置一下,当我以一种方式编译我的程序时,这个函数会写入标准错误,如果我以另一种方式编译我的程序,这个函数会变成no-op。有没有一些简单的编译时切换来做到这一点?或者我必须自己实现一些东西吗?我认为涉及跟踪不是解决这个问题的正确方法 相反,您可以使用预处理器来禁用/启用调试消息。将以下内容放在单独的文件中: {-# LANGUAGE CPP #-} import System.IO debug :: S

好的,这里有一个简单的问题。我已经编写了一个函数
debug::String->IO()
。我想设置一下,当我以一种方式编译我的程序时,这个函数会写入标准错误,如果我以另一种方式编译我的程序,这个函数会变成no-op。有没有一些简单的编译时切换来做到这一点?或者我必须自己实现一些东西吗?

我认为涉及
跟踪
不是解决这个问题的正确方法

相反,您可以使用预处理器来禁用/启用调试消息。将以下内容放在单独的文件中:

{-# LANGUAGE CPP #-}
import System.IO

debug :: String -> IO ()
debug message =
#ifdef DEBUG
  hPutStrLn stderr message
#else
  return ()
#endif

{-#LANGUAGE CPP#-}
行启用当前文件的C预处理器。然后,您可以使用
ghc-DDEBUG
或仅使用
ghc
编译文件,并进行调试/不进行调试。您可以使用CPP预处理器和
#ifdef
执行此操作

  • 首先,使用
    #ifdef
    在函数的两个版本之间进行选择

    {-# LANGUAGE CPP #-}
    module Logging (debug) where
    
    debug :: String -> IO ()
    #ifdef DEBUG
    debug = putStrLn
    #else
    debug _ = return ()
    #endif
    
  • 然后,在
    .cabal
    文件中添加一个标志来控制它

    ...
    
    flag debug
      description: Enable debug logging
      default:     False
    
    executable foo  -- or library
      if flag(debug)
        cpp-options:  -DDEBUG
    
      ...
    
  • 最后,要启用调试,请在配置时使用
    -f
    启用标志:

    $ cabal configure -f debug
    

  • 为了补充这里给出的优秀答案,我想提到这种方法,以防人们(如我)将最新版本的
    stack
    hpack
    一起使用

    package.yaml
    文件中,我添加了以下内容:

      flags:
        debug: # Or whatever name you want to give to the flag
          description: Enable debug
           manual: True
           default: False
    
       when:
         - condition: flag(debug)
           cpp-options:  -DDEBUG
    
    然后,我建议将
    traceIO
    from与结合使用,以便
    traceIO
    在没有
    debug
    标志的情况下编译代码时不会产生任何效果:

    {-# LANGUAGE CPP #-}
    
    -- ...
    
    #ifdef DEBUG
    import Debug.Trace
    #else
    import Debug.NoTrace
    #endif              
    
    -- ...
    someFunc :: IO ()
    someFunc = do
        -- ...
        traceIO "Whatever..."
    
    使用堆栈时,可以使用
    --flag
    选项启用
    debug
    标志:

    stack build --flag "your-package:debug"
    
    或者,如果您正在测试软件包:

    stack build --flag "your-package:debug"
    
    如果未使用
    hpack
    ,则可以按照以下说明配置阴谋集团文件:
    .

    您是否考虑过使用
    Debug.Trace
    ?提供了一些不错的细节。@devnull
    trace
    不会做我想做的-但是
    traceIO
    可能。。。