嘿,我回来了另一个haskell问题。我在here中问了一个问题,现在我可以完美地得到空行,现在我想尝试在haskell中的两个特定空行之间获取文本。(例如,我将在开头和第一个之间得到文本空行。)我无法想到在haskell中有任何方法可以做到这一点,因为我无法理解语法并有效地使用它,所以我真的需要你的帮助。我做一些io的做法就像是跟随;`
main=do{
readFile "/tmp/foo.txt" >>= print . length . filter (== '?');
readFile "/tmp/foo.txt" >>= print . length . words;
readFile "/tmp/foo.txt" >>= print . length . filter (== '.');
readFile "/tmp/foo.txt" >>= print . length . filter null . lines;
}`
有了这个,我可以计算句子数,问号数,空行数等。现在我想在两个空行之间得到文本。如果你帮助我完成我无法解决的最后一次练习,我将非常高兴。谢谢你们!
答案 0 :(得分:2)
最简单的方法是使用函数lines
,groupBy
和filter
lines
用于在字符串列表中拆分String
(每个元素一行)groupBy
组然后是非空的所有行 - 这应该是你必须编写一个谓词的最困难的部分,如果它们非空,那么对于两个后续元素是真的:groupBy (\x y -> ???)
filter
出形状[""]
这里是ghci
中的一些示例用法λ > import Data.List
λ > let groupify = ???
λ > l <- readFile "~/tmux.conf"
λ > map length $ groupify l
[4,7,3,1,4,2,2,5,4,3,3,2,7,4,4,4,3,3,3,2]
您可以在我的github-repo
中查看我的tmux配置文件的内容这个问题的解决方案是
groupify = filter (/= [""]) . groupBy (\x y -> x /= "" && y /= "") . lines
答案 1 :(得分:0)
你可以尝试模式匹配,它实际上说它的作用:
betweenEmptyLines :: [String] -> [String]
betweenEmptyLines [] = []
betweenEmptyLines ("":line:"":rest) = line:(betweenEmptyLines $ "":rest)
betweenEmptyLines (line:rest) = betweenEmptyLines rest
工作原理:
> betweenEmptyLines ["foo", "", "the bar", "", "and", "also", "", "the baz", "", "but", "not", "rest"]
["the bar","the baz"]