我正在尝试读取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
答案 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}}。