如何将文本文件读入haskell程序?

时间:2012-10-30 23:42:54

标签: haskell

我有一个文本文件,每行包含两个列表。每个列表可以包含任意数量的字母数字参数。 例如[t1,t2,...] [m1,m2,...] 我可以将文件读入ghc,但是如何将其读入另一个主文件中,主文件如何分别识别每个参数然后处理它?

1 个答案:

答案 0 :(得分:2)

我认为你最好自己弄清楚这一点,但我有一些指示。 首先,在你完成剩下的代码工作之前,尽量不要处理文件访问,否则你最终可能会遇到IO。从一些示例数据开始:

sampleData = "[m1,m2,m3][x1,x2,x3,x4]\n[f3,f4,f5][y7,y8,y123]\n[m4,m5,m6][x5,x6,x7,x8]"

您不应在代码中的任何其他位置提及sampleData,但您应该在ghci中使用它进行测试。

一旦你拥有了一个可以完成所需工作的功能,例如processLists::String->[(String,String)],你就可以用{/ 1>重新发送readFile "data.txt" :: IO String

readInLists :: FilePath -> IO [(String,String)]
readInLists filename = fmap processLists (readFile filename)

如果fmap对您没有意义,您可以阅读tutorial I accidentally wrote

如果它们确实是字母数字,您可以很容易地拆分它们。这里有一些方便的功能,有例子。

tail :: [a] -> [a]
tail "(This)" = "This)"

您可以使用它来丢弃字符串前面不需要的东西。

break :: (Char->Bool) -> String -> (String,String)
break (== ' ') "Hello Mum" = ("Hello"," Mum")

所以break使用测试来查找第二个字符串的第一个字符,并在它之前打破字符串。 请注意,中断字符仍然位于下一个字符串的前面。 span是相同的,但使用了第一个列表中的内容测试,所以

span :: (Char->Bool) -> String -> (String,String)
span (/= ' ') "Hello Mum" = ("Hello"," Mum")

您可以将这些功能用于(==',')isAlphaNum之类的内容(您必须在文件顶部import Data.Char使用它)。

您可能希望查看this answer中的splitWithsplitOn函数。它们基于Prelude中splitwords的定义。