【问题标题】:How to read text files into a haskell program?如何将文本文件读入haskell程序?
【发布时间】:2012-10-30 23:42:54
【问题描述】:

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

【问题讨论】:

  • 你试过什么?您是否查看过任何 Haskell 教程或文档的相关部分?
  • This 是一本帮助你学习 Haskell 的好书。它有一个关于 I/O 的精彩章节。

标签: haskell


【解决方案1】:

我认为您最好自己弄清楚其中的大部分内容,但我有一些建议给您。 首先,在其余代码正常工作之前,尽量不要处理文件访问,否则您最终可能会到处都有 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 对您没有意义,您可以阅读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 的定义。

【讨论】:

  • 你“不小心”写了一个教程?这是怎么发生的? =p
  • @Code-Guru 我写了一个答案,但它变得相当失控。它最终比我的典型答案更长,现在甚至还有一个附录。它开始是一个快速的几个例子,但最终更像是一个教程。哦,好吧。
  • 答案键和教程键就在旁边。
  • 上帝禁止一个答案有太多细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多