8

我是 Haskell 的新手。

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

4

2 回答 2

7

假设你有一个函数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]

写文件

您可以像这样将其写入文件:

ghci> writeFile "myoutput.txt" (show (mungeData [1..5])

我会倾向于写

ghci> writeFile "myoutput.txt" $ show $ mungeData [1..5]

摆脱几个括号。

读回来

你可以用

ghci> fmap (read::String -> [Int]) $ readFile "myoutput.txt"

每行一个数字

您可以像这样为每个数字输出一行:

ghci> writeFile "myoutput'.txt" $ unlines.map show $ mungeData [1..5]

读回为

ghci> fmap (map read.lines::String -> [Int]) $ readFile "myoutput'.txt"
于 2013-01-30T03:00:34.177 回答
6

Reddit 上的这篇文章描述了如何为 GHCi 输出着色(GHC >= 7.6)。您可以指定一个日志功能,而不是漂亮的打印机。例如,将以下内容添加到您的.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

这会将 GHCi 的输出记录到ghci.log.

  • 日志文件必须已经存在,否则appendFile会报错。您必须手动创建它。

  • 它必须适合let声明,否则 GHCi 将拒绝它。用于:{ :}在 GHCi 中添加多行支持。

  • 显然, using:l摆脱了您在 中所做的所有导入ghci.conf,因此您仅限于 Prelude 功能。Reddit 帖子提到您可以以某种方式重新定义:l,但我对此一无所知。(如果您知道如何执行此操作,当然可以在日志文件不存在时自动生成它。)

于 2013-01-30T18:17:16.957 回答