【问题标题】:Getting text between two empty lines in haskell在haskell中的两个空行之间获取文本
【发布时间】:2015-12-18 08:07:01
【问题描述】:

嘿,我又带着另一个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;
}`

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

【问题讨论】:

  • 您使用括号和分号有什么特别的原因吗? Haskell 的语法被设计成你不需要它们,惯用的风格是不使用它们。
  • 你看过split库吗?
  • 哦,我不知道什么时候删除分号和括号,代码不起作用
  • 您需要使用indentation
  • 编程是关于使用可用的工具找到问题的解决方案。你不应该期望找到每个问题的教程。介绍性教程将教您基本的问题解决工具以及基本概念(例如语言的语法),这些都是您进一步学习的要求。

标签: haskell io


【解决方案1】:

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

  • lines 用于在字符串列表中拆分String(每个元素一行)
  • groupBy 然后将所有非空行分组 - 这应该是您必须编写一个谓词的最困难部分,如果两个后续元素非空,则它们为 true: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 -&gt; x /= "" &amp;&amp; y /= "") . lines

【讨论】:

  • 但是如果字符串是一个段落呢?在这种情况下,haskell 将如何得到正确的答案?假设在两个空行之间,我们正在阅读的文件中有一个很长的段落。在这种情况下我们应该怎么做?
  • 根据这个算法的结果将是一个字符串列表的列表,其中这个列表中的每个列表都是一个行列表,即一个段落。
  • 正如 user2407038 解释的那样 - 这个算法返回一个字符串列表,其中每个列表元素只是一个段落,去掉空行,如果你仔细查看我的 tmux 配置,里面有 2 个空行!
【解决方案2】:

您可以尝试模式匹配,它确实说明了它的作用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2021-08-21
    • 2019-10-10
    • 2021-02-07
    • 2013-04-02
    • 2012-08-17
    • 2023-02-13
    相关资源
    最近更新 更多