2012-04-11 19 views
1

スプリット機能の欠落に関する他のスレッドを見てきましたが、学習目的でこれを行い、自分自身を把握したいと思っていませんでした。 (何もそれと間違っているなら、私に教えてください)ハスケル:文字列分割。

split :: Char -> String -> [String] 
split c xs | null f = [] 
      | otherwise = f : split c s' 
    where (f,s) = break (== c) xs 
     s' | null s = s 
      | otherwise = tail s 

正常に動作するようですが、私は、文字列ではありません分割文字を使用する場合、関数は、単一のリストを返す:だからここにあります元の文字列の要素を返しますが、空のリストを返すようにします。私はそれを行う方法を理解することはできません。

アイデア?

答えて

1

あなたは単にあなたの元1の結果を変え、ラッパー関数を記述することができます。

split' x xs = go (split x xs) where 
    go [_] = [] 
    go ys = ys 

は、split関数を記述する多くの方法は、例えば、あります

split x xs = foldl' go [[]] xs where 
    go (ys:yss) y | y == x = []:ys:yss 
       | otherwise = (y:ys):yss  

または

import Data.List 

split x xs = map tail $ groupBy (const (/=x)) (x:xs) 
+0

+1。元の関数の主要部分は、 'break(== c)>>> second(split c。drop 1)>>> uncurry(:)'として書くこともできますが、 'xs 'は空です。 – Vitus

+0

非常に良い例です。新しいことを学ぶのはうれしいです。ありがとうございました。 –