2016-10-15 13 views
1

現在、リストのリスト内で現在のリストを2つに分割するのに苦労しています。例えば、私が持っている場合:Haskellのリストのリスト内で内側のリストを分割する

[[A,B,C,F],[F,G,H,I]] 

あなたは

[[A,B,C,F],[F],[G,H,I]] 

で終わるように、(Fが頭であるため)、私はさまざまな方法でこれをしようとした第二のリストを分割する簡単な方法があります関数から2つの別々の値を返す方法は見つけられません。さらに、私が分割したい値が複数の内部リスト内で繰り返されるので、リストの先頭であるときだけ分割したい、他の時間には分割したくないということです。私はそうのようにそれを実行しようとしました:

splitList [] = []; 
splitList (F:xs) = [[F]] ++ [xs]; 
splitList x = [x]; 

しかし、これは明らかに、私は、リスト内のすべての要素にそれをマッピングされているので、それは順番に動作しない原因と全体のリストの中にリストのリストを返しました。私が最近ハスケルで働き始めたので、どんな助けも大歓迎です。

+0

これはXYの問題のようです:http://meta.stackexchange.com/a/66378 –

答えて

3

関数は1つの値を返しますが、この値はリストやタプルなどであるため、複数の値を返すことができます。

まず、リストの先頭から 'F'を分割する方法を定義します。

splitF :: String -> [String] 
splitF ('F':xs) = ["F", xs] 
splitF xxs  = [xxs] 

splitF "ABCF" ≡ ["ABCF"] 
splitF "FGHI" ≡ ["F","GHI"] 

この関数をリストにマップします。

map splitF ["ABCF","FGHI"] ≡ [["ABCF"],["F","GHI"]] 

最後に、リストを連結します。

(concat . map splitF) ["ABCF","FGHI"] ≡ ["ABCF","F","GHI"] 

concatMap splitF ["ABCF","FGHI"] ≡ ["ABCF","F","GHI"] 
関連する問題