haskell读取文件并将其转换为列表地图

时间:2016-03-16 19:52:48

标签: list haskell dictionary char

输入文件是txt:

000011S \ n

0001110 \ n

001G111 \ n

0001000 \ n

结果是:

[[" 0"" 0"" 0"" 0"" 1&#34 ;, " 1"," S"],[" 0"," 0"," 0",&#34 ; 1"," 1"," 1"," 0"] [...]]

使用

读取文本文件
file <- openFile nameFile ReadMode 

和最终输出     [[&#34;&#34;&#34; 1&#34;&#34; 0&#34;&#34; B&#34;],[&#34; d&#34;,& #34; O&#34;&#34; T&#34;&#34; 2&#34;]] 是一个包含char

列表的地图

尝试:

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

但返回[[string]]

因为它可以返回我想要的输出吗? [[字符]] 有什么等价的单词,但对于char?

2 个答案:

答案 0 :(得分:2)

一种解决方案

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

应该做的伎俩

备注

这里return是写\c -> [c]的巧妙技巧 - 将Char包装成单例列表,因为列表是monad

如何运作

让我试着解释一下:

  • lines会将输入拆分为行:[String],此列表中的每个元素都是一行
  • 外部map (...) . lines会将(...)中的函数应用于每一行
  • 内部的功能:map return会再次映射一行的每个字符(请记住:String只是Char的列表)并将return应用于return每个人物
  • 现在'a' -> [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 -> [[Char]]

关于您的评论

如果您期望String -> [String](只是convert = lines,那么您只需要{{1}}!

答案 1 :(得分:0)

[[Char]] == [String]

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

会因空字符串而失败。

map concat [[...]]

相关问题