【发布时间】:2012-03-17 21:18:34
【问题描述】:
我刚刚学习 Haskell,我正在尝试编写一些代码来简单地读取文件并使用 lines 函数创建行列表。例如,我有一个名为 data.txt 的文件,其中包含以下几行:
this is line one
another line
and the final line
这是我试图用来将这些数据读入列表并将其打印到屏幕上的代码:
import System.IO
import Control.Monad
main = do
let list = []
handle <- openFile "data.txt" ReadMode
contents <- hGetContents handle
let myLines = lines contents
list = listLines myLines
print list
hClose handle
listLines :: [String] -> [String]
listLines = map read
生成的代码编译,但不产生任何输出。我得到以下输出:
runhaskell test.hs
read_file.hs: Prelude.read: no parse
谁能帮我理解我的代码有什么问题?谢谢。
【问题讨论】:
-
你希望
listLines做什么? -
问题是,
String → String版本的read需要 Haskell 字符串格式(即像"Hello \\" world \\""这样的原始字符串,然后将其转换为Hello " world ")。如果您只想打印从文件中获得的内容,请完全删除list = listLines myLines。 -
我希望
listLines获取一个字符串列表并返回一个字符串列表。嗯,我真的不明白原始字符串与我的代码有什么关系?你能进一步解释一下吗? -
你和this very similar question是同一个人吗?
-
read应该采用某种数据类型的字符串表示并将其转换为该类型的值。因此,例如read "42" :: Int ≡ 42或read "[1,2]" :: [Int] ≡ [1,2]。什么是字符串的表示形式,已经是字符串?好吧,您使用字符串(例如hello world),添加引号,以转义形式显示特殊字符(即换行符→\n、"→\"等等)。您希望您的 Haskell 代码以完全 this 的形式转换为read字符串;但由于显而易见的原因,这失败了。
标签: haskell