2012-02-28 12 views
2

Haskellの本でconcat関数を見たとき、Haskellで以下のリストをどのように平坦化できるのだろうかと思います。 Pythonでは、関数の型を調べることができるので、これを行うことができます。しかし、ハスケルではできませんでした。下のリストをどのように平らにすることができますか?操作はリストの一覧に表示されます。 how

input: [[1, 2], [[2, 3], 5], [[[2, 3], [4, 5]], [2, 3]]] 
output: [1, 2, 2, 3, 5, 2, 3, 4, 5, 2, 3] 
+2

注意を - あなたはリストを入れ子にしている場合はHaskellであなたはリストではなく木を使用し、一般的でしょう。 Haskellのような強く型付けされた言語では、ネストの構造がリストの型に反映されなければならない - 時にはこれは良いことですが、構造体ではなく要素を考慮する必要があるツリーが本当に必要なことがよくあります。ローズツリーである標準ライブラリにモジュールData.Treeがあります。または、独自のロールを簡単に作成できます。 –

+4

あなたの入力はHaskellの有効なリストさえありません。 –

+0

関連:http://stackoverflow.com/questions/5994051/is-there-a-function-to-flatten-a-nested-list-of-elements –

答えて

4

haskellで異なる深度のリストを作成することはできません。それはタイプチェックをしません。 [[a]][[[a]]]と同じ種類ではありません。この関数はあなたの質問を解決しますが、同じ深さのリストにしかありません。

flat::[[a]] -> [a] 
flat [] = [] 
flat l:ls = l ++ flat ls 
+0

実際には、この関数はすでに存在し、 'concat'と呼ばれています。 – fuz

+0

リマインダーありがとう。私はhaskellをプログラムして以来長い時間がかかりました。そのような関数があるかどうかは分かりませんでしたので、自分自身を安全な面に置くように書きました – nist

+1

この質問では、リスト[ ]、それ以上であれば、連結は複数回呼び出されるべきです。 concatは1つのレベルのみを平坦化します。もちろん、これは上記の質問には当てはまりませんが、注意すべきことです。 – Gangadhar

6

すでに指摘したように、Haskellでは任意のネストされたリストを持つことはできません。 (ファンシープラグマを使用して汚れた型クラスのハックなし)最も近いものは次のようなものになるだろう:

data Nested a = L a | B [Nested a] 

flatten :: Nested a -> [a] 
flatten (L x) = [x] 
flatten (B xs) = concatMap flatten xs 

print $ flatten $ B[B[L 1,L 2],B[B[L 2,L 3],L 5],B[B[B[L 2,L 3],B[L 4, L 5]],B[L 2,L 3]]] 
--[1,2,2,3,5,2,3,4,5,2,3] 
+1

「ネストされた」は単純なツリー(http://en.wikipedia.org/wiki/Tree_%28data_structure%29)です。「L」はリーフで、「B」はブランチです。 – amindfv

関連する問題