获取haskell中两个空行之间的文本
嘿,我又问了哈斯克尔一个问题。我在中问了一个问题,现在我可以完美地获取空行,现在我想尝试获取haskell中两个特定空行之间的文本(例如,我将获取开头和第一个空行之间的文本)在haskell中,我想不出任何方法可以做到这一点,因为我无法理解语法并有效地使用它,所以我真的需要您的帮助。我做一些io工作的实践如下:`获取haskell中两个空行之间的文本,haskell,io,Haskell,Io,嘿,我又问了哈斯克尔一个问题。我在中问了一个问题,现在我可以完美地获取空行,现在我想尝试获取haskell中两个特定空行之间的文本(例如,我将获取开头和第一个空行之间的文本)在haskell中,我想不出任何方法可以做到这一点,因为我无法理解语法并有效地使用它,所以我真的需要您的帮助。我做一些io工作的实践如下:` main=do{ readFile "/tmp/foo.txt" >>= print . length . filter (== '?'); readFile "/tmp/
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;
}`
有了这个,我可以数句子的数量,问号的数量,空行的数量等等。现在我想得到两个空行之间的文本。如果你能帮我做最后一个我无法解决的练习,我将非常高兴。从现在开始谢谢你 最简单的方法是使用函数
行
、分组方式
和过滤器
用于在字符串列表中拆分行
(每个元素一行)字符串
对所有非空行进行分组-这应该是最困难的部分,如果后续两个元素为非空,则必须编写一个谓词:groupBy
groupBy(\x y->?)
- 然后
过滤出shape的元素
[“”]
λ > 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]
λ>导入数据列表
λ>设分组=???
λ>l映射长度$groupify l
[4,7,3,1,4,2,2,5,4,3,3,2,7,4,4,4,3,3,3,2]
您可以在我的网站上查看我的tmux配置文件的内容
更新
这个问题的解决办法是
groupify=filter(/=[“”])。groupBy(\x y->x/=“”&&y/=“”)。行
您可以尝试模式匹配,它字面上说明了它的功能:
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"]
使用括号和分号有什么特别的原因吗?Haskell的语法设计是为了让你不需要它们,惯用的风格是不使用它们。你看过库吗?哦,我不知道当我删除分号和括号时,代码不起作用,你需要使用。编程就是使用你现有的工具来寻找问题的解决方案。你不应该期望为每一个问题都找到一个教程。入门教程会教你基本的解决问题的工具,也会教你一些基本的概念,比如语法,这是你进一步学习的要求。但是如果字符串是一个段落呢?在这种情况下,haskell如何得到正确答案?假设在两个空行之间,我们正在阅读的文件中有一个很长的段落。在这种情况下我们应该怎么做?根据该算法的结果将是一个字符串列表,其中该列表中的每个列表都是一个行列表,即一个段落。正如user2407038所解释的,该算法返回一个字符串列表,其中每个列表元素都只是一个段落,去掉空行,如果你仔细看我的tmux配置,里面有两行空行!