haskell - 一元谓词检查字符串中的字符

标签 haskell functional-programming currying

我正在阅读 Real World Haskell ,我尝试实现 splitLines自己编写代码,我想出了或多或少相同的实现(Chapter 4,第 73 页):

splitLines :: String -> [String]
splitLines [] = []
splitLines ('\r':a) = splitLines a
splitLines ('\n':a) = splitLines a
splitLines       a  = let (l,r) = break isCRorNL a
                      in l:splitLines r
                      where isCRorNL e = ???
--the book defines isCRorNL c = c == '\n' || c == '\r'

但是,我确实花费了太多时间来尝试编写 isCRorNL以我能想到的最实用和最易读的方式,这样我就可以摆脱 where并转动 splitLines 的最后一个定义变成一个最接近英语的句子(就像 compare `on` length 等),但没有成功。

我一直在经历的一些稀疏的想法:
  • 一个 lambda,(\c -> c == '\n' || c == '\r') ,对于这样一个简单而具体的任务来说,只是太多的力量和太少的表现力;
  • 此外,它包含大量重复的代码和/或它是无用的冗长。
  • 无论我必须放入isCRorNL必须有类型 Char -> Bool ,
  • 因此它可以有任何类型a1 -> a2 -> ... -> an -> Char -> Bool如果我提供第一个 n论据。
  • any函数可以帮助我检查给定字符是否为 '\n''\r'或者,换句话说,如果它在 Char 的列表中小号 "\n\r" .
  • 由于我想检查是否相等,我可以通过 (==)到我的功能。
  • 因此isCRorNL可以有类型 (Char -> Char -> Bool) -> [Char] -> Char -> Bool (或将前两个参数倒置),我可以传递给它 (==)作为第一个参数和 "\n\r"作为第二个论点。
  • 所以我一直在寻找一些我可以编写的标准函数来获得这样的功能。

  • 最后我放弃了,这样定义:isCRorNL e = any (== e) "\n\r" ;我认为这在可扩展性方面非常好,因为我可以在 "…" 中添加尽可能多的字符,我可以更改运算符 == ;可悲的是,我不能将函数直接放在使用它的地方,因为我无法将其编写为部分应用的函数。

    你会怎么做?

    最佳答案

    当我在问题中查找链接并访问它(第一次)时,我意识到代码块是由读者评论的,而 splitLines 下的第一条评论阅读:

    augustss 2008-04-23

    [...] If you're making a point about functional style maybe you should use

    isLineSeparator = (`elem` "\r\n")
    


    因此,我对函数的组合思考了很多,而最简单的解决方案在于部分应用一个如此简单的函数,elem .这里的缺点是用于检查相等性的运算符是内置在 elem 中的。并且无法更改。尽管如此,我还是因为没有想到 elem 而感到愚蠢。我。

    关于haskell - 一元谓词检查字符串中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59338559/

    相关文章:

    haskell - Haskell中Either和Except在用法上有什么区别?

    swift:无法将 [sic] 字符数组缩减为字符串

    javascript - Lodash 中 curry 和 curryRight 的区别

    list - Currying:追加两个列表

    ocaml - 如何 curry 函数 w.r.t. OCaml 中的可选参数

    haskell - 哪些语言实现了函数式编程的特性?

    haskell - 将单个记录字段更改为严格会导致性能下降

    opengl - 使用基于递归的动画时在 drawPicture "Gloss/OpenGL Stack Overflow "之后出现错误 .""

    java - 在 MongoDB 中的文档上使用 forEach

    r - 从闭包生成函数列表