为什么这两段代码的行为不一样?

omu*_*gru 2 haskell functional-programming

为什么以下这些功能不一样?第一个是正确的字符串拆分,但第二个似乎永远添加"",创建一个无限的列表

正确代码:

my_split :: [Char]->Char->[[Char]]
my_split [] _ = [[]]
my_split lista y
    | notElem y lista=[lista]
    | otherwise=isMatch:(my_split rest y)
    where 
            isMatch=takeWhile (/=y) lista
            rest=tail $ dropWhile (/=y) lista
Run Code Online (Sandbox Code Playgroud)

坏代码:

my_split :: [Char]->Char->[[Char]]
my_split [] _ = [[]]
my_split lista y
    | notElem y lista=[lista]
    | otherwise=isMatch:(my_split rest y)
    where 
    (isMatch,rest)=break (==y) lista
Run Code Online (Sandbox Code Playgroud)

唯一不同的部分是休息条件,在我看来它应该做同样的事情......加上第一个函数表单应该确保我不会永远地为我的结果添加空列表...抱歉任何问题,并提前感谢

ben*_*n w 6

GOA> break (=='c') "abcde"
("ab","cde")
GOA> break (=='c') "cde"
("","cde")
GOA> 
Run Code Online (Sandbox Code Playgroud)

break 不剥离它匹配的字符.