输入文件是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?
答案 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 [[...]]