2016-04-08 39 views
1

Haskell'de iç içe geçmiş bir listeyi ters çevirmeye çalışıyorum.Haskell'de özel iç içe geçmiş bir listeyi tersine çevirme

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

Ben de düzleştirilmiş fonksiyonu var:

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

Şimdi benim ters işlevi yazmak isteyen ben iç içe listeleri yüzden tanýmladýysanýz Haskell bir şey değildir farkındayım. Fonksiyon şu şekilde tanımlanır: Listedeki öğeleri yeniden düzenlediğim için mantıklı olan hangisi mantıklı olduğunu düşündüğüm bir anlam ifade eder.

Temel bir ters fonksiyonun nasıl yazılacağını anlıyorum ve ayrıca Haskell'in standart listelerinin tersinin zaten tanımlandığını biliyorum.

Sorum şu: Listenin başlığının da bir liste olduğu durumla nasıl baş edebilirim? Bilmem gereken şey, listenin başını ters çevirip kuyruğun arkasına geri koymam. Ama bunu nasıl başarabilirim?

cevap

4

neden bu şekilde

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

size veri tanımına (Göster) türetmek ekleyin eğer

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

Teşekkürler. Bu şekilde denedim ve işe yaradı. – Coliwack

3

Sizin iç içe liste aslında leavess en elemanları ile bir ağaçtır:

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

myreverse, yatay çevirmeli, yani yinelemeliDiğer cevaplar gibi SubList her listenin 0.

Buradaki ders: Veri yapılarını görselleştirmek, bunların üzerindeki eylemleri anlamaya ve uygulamaya yardımcı olur.