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)
唯一不同的部分是休息条件,在我看来它应该做同样的事情......加上第一个函数表单应该确保我不会永远地为我的结果添加空列表...抱歉任何问题,并提前感谢
GOA> break (=='c') "abcde"
("ab","cde")
GOA> break (=='c') "cde"
("","cde")
GOA>
Run Code Online (Sandbox Code Playgroud)
break 不剥离它匹配的字符.