2016-04-08 7 views
1

Haskellでネストされたリストを逆にしようとしています。私は、ネストされたリストは、そう私は1つの定義されたHaskellでのものではないことを認識しています:私はまた、平坦化機能を持っているHaskellでカスタムネストされたリストを逆にする

data NestedList a = Elem a | SubList [NestedList a] 

flatten :: NestedList a -> [a] 
flatten (Elem x) = [x] 
flatten (SubList x) = concatMap flatten x 

は今、私は私の逆関数を記述したいです。関数は次のように定義されます。

myreverse :: NestedList a -> NestedList a 

これはリスト内の要素を並べ替えるだけなので、私は理にかなっていると思います。

私は基本的な逆関数を書く方法を理解しています。また、Haskellの標準リストでは、逆関数が既に定義されていることも知っています。

私の質問は、リストの先頭もリストであるケースをどうすれば処理できますか?私が知っていることは、リストの先頭を逆にして尾の逆に戻すことです。しかし、これを達成する方法は?

答えて

4

なぜこのよう

rev :: NestedList a -> NestedList a 
rev (Elem a) = Elem a 
rev (SubList xs) = SubList $ map rev $ reverse xs 

あなたのデータ定義に(表示)の導出追加した場合、

Prelude> rev $ SubList [Elem 1, SubList [Elem 2, Elem 3]] 
SubList [SubList [Elem 3,Elem 2],Elem 1] 

Prelude> rev $ SubList [Elem 1, SubList []] 
SubList [SubList [],Elem 1] 
+0

ありがとうございました。私はこのように試して、それは働いた。 – Coliwack

3

あなたのネストされたリストは、実際にleavessの要素を持つ木です:

    SubList 
      /  \ 
     SubList   Elem 4 
    / |  \ 
Elem 1 Elem 2 Elem 3 

myreverseは水平フリップです(つまり、再帰的な)。他の回答が指摘しているように、SubListの各リストの0。

ここでのレッスン:データ構造の視覚化は、それらのアクションを理解して実装するのに役立ちます。

関連する問題