haskell - 了解haskell中的Splitlines函数
问题描述
以下是我试图理解的代码段:
splitLines [] = []
splitLines cs =
let (pre, suf) = break isLineTerminator cs
in pre : case suf of
('\r':'\n':rest) -> splitLines rest
('\r':rest) -> splitLines rest
('\n':rest) -> splitLines rest
_ -> []
isLineTerminator c = c == '\r' || c == '\n'
我无法理解的是“pre:”中将分配给“pre”的值是什么。如果我是对的,“:”用于附加,所以“pre”应该是前缀,但值是多少?
解决方案
如果你会执行break isLineTerminator "foo\r\nbar"
,那么pre
将会是"foo"
并且suf
将会是"\r\nbar"
。break
将确保第二个参数在第一次出现时被拆分,其中包括从右侧传递的函数(在本例中)isLineTerminator c
返回True
的匹配项。True
isLineTerminator
喂入suf
_
case suf of
('\r':'\n':rest) -> splitLines rest
('\r':rest) -> splitLines rest
('\n':rest) -> splitLines rest
_ -> []
将尝试从 中删除换行符suf
,同时将其余部分 ( "bar"
)splitLines
再次传递给。pre
将"bar"
在递归调用中,而suf
将是""
,因此匹配最后一种情况。在回来的路上,它会变平"foo" : "bar" : []
到["foo", "bar"]
(cons operator :
)。
推荐阅读
- tensorflow - TensorFlow XOR 实现,无法达到 100% 的准确率
- reactjs - 如何在样式化组件中定义 className
- firebase - 将 firebase 导入到 react-native
- java - Java 从 URL NullPointerException 解析 JSON
- java - 基于其他两个对象的子类创建对象
- php - 更新用于在 PHP 中解析 XML 的 URL
- php - 在长脚本中死亡或退出是一种好习惯(PHP)
- java - Selenium 使用 java 处理打开的文件对话框
- python - 无法通过 python 请求下载 HTTP 文件
- git - npm 安装错误 ssh