将Haskell GHCi命令结果输出到txt文件

Anc*_*end 8 haskell

我是Haskell的新手.

我很难将GHCi的命令结果输出到文件中.我想知道是否有人可以给我一个简单的解释如何做到这一点?到目前为止我在网上找到的例子似乎过于复杂.

And*_*ewC 6

让我们假设你有一个功能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)

WriteFile的

您可以将此文件写入此文件:

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)

  • 你可以重写`main`来写入文件而不是屏幕,或者如果它太复杂你可以用`ghc Test.hs -O2 -o test.exe`编译它(在linux/MacOS/unix等上只是`test`) )然后重定向其输出:`test.exe> testoutput.txt` (2认同)

Dav*_*vid 6

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,但我不知道任何关于那个.(如果您知道如何执行此操作,当然可以自动生成日志文件(如果不存在).)