在haskell中的两个空行之间获取文本

时间:2015-12-18 08:07:01

标签: haskell io

嘿,我回来了另一个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;
}`

有了这个,我可以计算句子数,问号数,空行数等。现在我想在两个空行之间得到文本。如果你帮助我完成我无法解决的最后一次练习,我将非常高兴。谢谢你们!

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用函数linesgroupByfilter

  • 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"]