0

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

4

1 回答 1

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)],你可以readFile "data.txt" :: IO String

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

如果fmap对您没有意义,您可以阅读我不小心写的教程

如果它们真的是字母数字,您可以很容易地拆分它们。以下是一些方便的功能,并附有示例。

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在文件顶部才能使用它)一起使用。

你可能想看看我在这个答案splitWith中的功能。它们基于 Prelude 的定义和来自 Prelude 的定义。splitOnsplitwords

于 2012-10-31T01:30:55.397 回答