2012-01-23 14 views
2

これらの機能が同じ機能を果たしないのはなぜですか?一つ目は、適切な文字列分割を行っているが、もう一つは永遠に「」追加し続けるように見える、無限リストにこれらの2つのコードが同じように動作しないのはなぜですか?

右のコード作成:

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 

悪いコード:

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 

違う部分だけがブレーク条件で、実際には同じことをする必要があるようです...最初の関数形式は、私の結果に空のリストを永久に追加しないようにする必要があります... noobishについては申し訳ありません事前に質問と感謝

答えて

6
GOA> break (=='c') "abcde" 
("ab","cde") 
GOA> break (=='c') "cde" 
("","cde") 
GOA> 

break一致する文字は削除されません。あなたがdropWhileの結果にtailを適用し、働くあなたの最初のバージョンで

3
break p xs = (takeWhile (not . p) xs, dropWhile (not . p) xs) 

動作しない2番目のバージョンでは、この操作を行わないでください。

2

他の人が説明したように、breakは、takeWhileとdropWhileのペアを返します。あなたは、ドロップの尻尾を取ってほしい。あなたは次のようにすることができます:

where 
(isMatch,_:rest)=break (==y) lista 
関連する問題