代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

调试纯方法链

  •  1
  • Bercovici Adrian  · 技术社区  · 6 年前

    你好,我想问haskell的同事们,如果你有一长串纯方法,你怎么能高效地调试haskell程序。例如:

    do
      a<-impure
      (pure a)  # where pure calls pure1->pure2->pure2 
    

    如果一切都不正常,我如何调试调用堆栈深处的任何东西 IO 所以我不能 print writeFile 没有重大努力的地方?
    haskell fellows会把所有签名都改成 IO something 看看代码在哪里崩溃?

    具体例子

    主要的

    module Main where 
        import Data.Text(Text,pack,unpack)
        import Data.Text.IO(readFile,writeFile)
        import TCPFile(TCPFile)
        import TCPEncoding(toText,fromText)
        main::IO()
        main=do
            dat<-readTcpFile "test.txt"
            print dat
            writeTcpFile "output.txt" dat
    
        writeTcpFile::FilePath->TCPFile->IO()
        writeTcpFile path file=Data.Text.IO.writeFile path (toText file)
    
        readTcpFile::FilePath->IO TCPFile
        readTcpFile path =fromText <$> Data.Text.IO.readFile path 
    
    
    module TCPEncoding where 
    import Data.Text
    class TextEncode a where
        toText::a-> Text
        fromText::Text-> a
    

    我不会写方法的整个层次结构。我只想知道如何运行程序,直到某一行,并获得变量值和堆栈帧。

    在这个程序的情况下,我最后得到的所有信息都用 writeTcpFile 是:

    main: <<loop>>

    那么我如何调试 fromText 内部使用的方法 readTcpFile 它的内部呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   cmdv    6 年前

    我倾向于使用 trace 如前所述

    trace :: String -> a -> a 所以需要一段时间 String 值,并返回相同的值,如 id 。它将在您想要使用它的时候触发,因此对于您:

    main = do
      dat <- readTcpFile "test.txt"
      _ <- trace "write what you want to see in console" dat
      writeTcpFile "output.txt" dat
    

    如果你想追踪 dat 您必须确保将其转换为 一串 . 在do区块内,它也被绑定到 _ 所以它没有任何副作用。