首页 > 解决方案 > 了解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”应该是前缀,但值是多少?

标签: haskell

解决方案


如果你会执行break isLineTerminator "foo\r\nbar",那么pre将会是"foo"并且suf将会是"\r\nbar"break将确保第二个参数在第一次出现时被拆分,其中包括从右侧传递的函数(在本例中)isLineTerminator c返回True的匹配项。TrueisLineTerminator

喂入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 :)。


推荐阅读