了解haskell

时间:2018-05-01 16:52:31

标签: haskell

以下是我想要了解的代码段:

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”应该是前缀,但具有什么价值?

1 个答案:

答案 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运算符:)。