读取和写入haskell中的文件

时间:2014-07-28 12:54:23

标签: haskell file-io

我正在尝试读取haskell中的文件。

最初我试过了:

import System.IO
import Control.Monad

main = do
    let list = []
    handle <- openFile "data.txt" ReadMode
    contents <- hGetContents handle
    let singlewords = words contents
        list = f singlewords
    print list
    hClose handle

f :: [String] -> [Int]
f = map read

我已经将其更新为:

import System.IO
import Control.Monad

main = do
    handle <- openFile "data.txt" ReadMode
    contents <- hGetContents handle
    print contents

但是,现在输出看起来像:

"hdhdhdhhdhdhd\n"
"hdhdhdhdhh\n"

我希望输出看起来像:

hdhdhhdhhdhdhdhd
hdhdhhshshshshshshh

1 个答案:

答案 0 :(得分:3)

您的第一个问题可由函数f = map read解释。此函数尝试通过将各个字符串解析为整数值,将字符串列表转换为整数列表。由于您的文件包含hdhdhdhdhdhdhd\nhdhdhdhdhdhh,因此这些字符均不是偶数,并且您收到错误消息,指出read无法将其解析为Int

您遇到的第二个问题是,一旦您删除了解析阶段以便只执行文件读取就是您使用print将文本输出到屏幕,而此处使用的相应函数是{ {1}}或putStr。区别在于putStrLn被定义为print,因此在将值放入屏幕之前,它会自动将值转换为字符串表示形式。如果您已经有print x = putStrLn (show x),请说出字符串String,则x = "hello"的输出为show x,因此它包含引号和任何其他转义字符。这是"\"hello\"",其中read (show x) == x解析字符串,就好像它是在源代码中定义的那样,即在双引号和适当的转义字符之间。因此,当您希望在屏幕上打印read时,您应该只使用putStrLn;如果要在屏幕上打印非字符串值,则应使用String,例如{ {1}}。