【问题标题】:haskell read a file and convert it map of listhaskell 读取文件并将其转换为列表映射
【发布时间】:2016-03-16 19:52:48
【问题描述】:

输入文件为txt:

000011S\n

0001110\n

001G111\n

0001000\n

结果是:

[["0","0","0","0","1","1","S"], ["0","0","0","1" ,"1","1","0"] [...]]

读取文本文件

file <- openFile nameFile ReadMode 

和最终输出 [["a","1","0","b"],["d","o","t","2"]] 是一张包含字符列表的地图

尝试:

convert x = map (map read . words) $ lines x

但返回 [[string]]

它可以返回我想要的输出吗? [[字符]], 除了 char 之外,word 有什么等价物吗?

【问题讨论】:

  • 我无法理解这个问题 - 但您知道 String 只是 [Char]
  • 能否请您发布文件内容以及您的预期答案应该是什么?
  • 是的字符串只是 [Char] 但我得到了双重列表,其中每一行文本都是一个列表,是另一个列表的一部分
  • 你得到了包装好的Strings,因为你在那里做了双重map - 你能编辑你的问题并提供输入和预期的输出吗?如果您的输入应该是 "a10b\ndot2" 或者这是预期的输出,我真的有麻烦

标签: list haskell dictionary char


【解决方案1】:

一个解决方案

convert :: String -> [[String]]
convert = map (map return) . lines

应该做的伎俩

备注

return 这里是写\c -&gt; [c] 的巧妙技巧 - 将Char 包装到单例列表中,因为列表是一个单子

它是如何工作的

让我试着解释一下:

  • lines 将输入分成几行:[String] 此列表中的每个元素都是一行
  • 外部的map (...) . lines 然后将(...) 中的函数应用到每一行
  • 里面的函数:map return 将再次映射一行的每个字符(记住:String 只是Char 的列表),因此会将return 应用于每个字符
  • 现在return 这里将只取一个字符并将其放入一个单例列表中:'a' -&gt; [a] = "a" 这正是您想要的

你的例子

Prelude> convert "000011S\n0001110\n001G111\n0001000\n"
[["0","0","0","0","1","1","S"]
,["0","0","0","1","1","1","0"]
,["0","0","1","G","1","1","1"]
,["0","0","0","1","0","0","0"]]

关于您的评论

如果您期望convert :: String -&gt; [[Char]](这只是String -&gt; [String],那么您只需要convert = lines

【讨论】:

  • 谢谢,但是有一个问题,因为输出是 [[String] ] 而不是 [[Char]]?不明白,不会造成类型问题?
  • 如果行得通,但不是很明白,我需要多练习。谢谢
  • 我对您的问题添加了评论 - 但请注意您的示例使用的是 [[String]] ;)
  • 如果你告诉我你在哪里理解有困难,我会尽力帮助你^^
  • 我同意,现在我明白了!非常感谢您的解释!
【解决方案2】:

[[Char]] == [String]

Prelude> map (map head) [["a","1","0","b"],["d","o","t","2"]]
["a10b","dot2"]

但是对于空字符串会失败。

map concat [[...]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2019-07-08
    • 1970-01-01
    • 2023-03-25
    • 2011-10-23
    • 2016-03-11
    相关资源
    最近更新 更多