我是Haskell的新手.
我很难将GHCi的命令结果输出到文件中.我想知道是否有人可以给我一个简单的解释如何做到这一点?到目前为止我在网上找到的例子似乎过于复杂.
让我们假设你有一个功能mungeData
而你做
ghci> mungeData [1..5]
[5,2,5,2,4,6,7,4,6,78,4,7,5,3,57,7,4,67,4,6,7,4,67,4]
Run Code Online (Sandbox Code Playgroud)
您可以将此文件写入此文件:
ghci> writeFile "myoutput.txt" (show (mungeData [1..5])
Run Code Online (Sandbox Code Playgroud)
我倾向于写
ghci> writeFile "myoutput.txt" $ show $ mungeData [1..5]
Run Code Online (Sandbox Code Playgroud)
摆脱几个括号.
你可以使用它
ghci> fmap (read::String -> [Int]) $ readFile "myoutput.txt"
Run Code Online (Sandbox Code Playgroud)
你可以输出一行每个数字,如下所示:
ghci> writeFile "myoutput'.txt" $ unlines.map show $ mungeData [1..5]
Run Code Online (Sandbox Code Playgroud)
读回来的
ghci> fmap (map read.lines::String -> [Int]) $ readFile "myoutput'.txt"
Run Code Online (Sandbox Code Playgroud)
Reddit上的这篇文章介绍了如何着色GHCi输出(GHC> = 7.6).您可以指定日志记录功能,而不是使用prettyprinter.例如,将以下内容添加到您的.ghci.conf
:
:{
let logFile = "/home/david/.ghc/ghci.log"
maxLogLength = 1024 -- max length of a single write
logPrint x = appendFile logFile (take maxLogLength (show x) ++ "\n") >> print x
:}
:set -interactive-print=logPrint
Run Code Online (Sandbox Code Playgroud)
这将记录GHCi的输出ghci.log
.
日志文件必须已经存在,否则appendFile
会抱怨.你必须手动创建它.
它必须符合let
声明,否则GHCi将拒绝它.用于:{ :}
在GHCi中添加多行支持.
显然,使用:l
摆脱了你在你的所有进口ghci.conf
,因此你只能使用Prelude功能.Reddit帖子提到你可以以某种方式重新定义:l
,但我不知道任何关于那个.(如果您知道如何执行此操作,当然可以自动生成日志文件(如果不存在).)