以下是我想要了解的代码段:
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”应该是前缀,但具有什么价值?
答案 0 :(得分:2)
如果您执行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运算符:
)。