SORU
9 Kasım 2012, Cuma


Paramorphisms nelerdir?

this classic paper, ben okurken paramorphisms takılıyorum. Ne yazık ki bu bölüm oldukça ince ve Wikipedia sayfası bir şey söylemiyor.

Haskell benim çeviri:

para :: (a -> [a] -> b -> b) -> b -> [a] -> b
para f base = h
  where
    h []       =   base
    h (x:xs)   =   f x xs (h xs)

Ama yazın, imza için herhangi bir sezgi ya da istenilen sonucu yok grok bilmiyorum.

Eylem bazı örnekler ne paramorphism, ve ne?


Evet, these questionsama paramorphisms doğrudan anlatmıyorlar görülen ve sadece referans olarak yararlı olabilir resources işaret, ama öğrenme materyalleri gibi oldum.

CEVAP
9 Kasım 2012, Cuma


Evet, o para. Olay bununla ile karşılaştırmak, ya da foldr:

para  :: (a -> [a] -> b -> b) -> b -> [a] -> b
foldr :: (a ->        b -> b) -> b -> [a] -> b

para  c n (x : xs) = c x xs (para c n xs)
foldr c n (x : xs) = c x    (foldr c n xs)
para  c n []       = n
foldr c n []       = n

Bazı insanlar paramorphisms arama "ilkel özyineleme" catamorphisms (foldr) ile buna karşılık"". yineleme

Nerede foldr'In iki parametre, belirli bir özyinelemeli olarak hesaplanan değer her sınıfın bir özyinelemeli giriş verileri (burada, bu kuyruk listesi), para'In parametreleri hem orijinal sınıfın ve değeri hesaplanan yinelemeli olarak.

Güzel para ile ifade edilen bu örnek, bir işlev listesi uygun yeterli topluluğudur.

suff :: [x] -> [[x]]
suff = para (\ x xs suffxs -> xs : suffxs) []

o kadar

suff "suffix" = ["uffix", "ffix", "fix", "ix", "x", ""]

Belki daha basit hala

safeTail :: [x] -> Maybe [x]
safeTail = para (\ _ xs _ -> Just xs) Nothing

"şube özyinelemeli olarak değişken hesaplanan ve sadece kuyruk geri verir. yok sayıyor "mahkumlar hangi Tembel değerlendirilmesi, özyinelemeli hesaplama hiç olmaz ve kuyruk sabit zaman elde edilir.

Tanımlayabilirsiniz foldr para oldukça kolay; bu biraz daha zor tanımlamak para foldr, ama bu kesinlikle mümkün, ve herkes bilmeli ölmenin nasıl bir şey!

foldr c n =       para  (\ x  xs  t ->           c x    t)       n
para  c n = snd . foldr (\ x (xs, t) -> (x : xs, c x xs t)) ([], n)

foldr 26 *tanımlama için bir hile yenidenkopyalaorijinal veri, orijinal giriş olmasına rağmen her adım at kuyruğu bir kopyasını erişim kazanmak olduğunu. Sonunda, snd atar giriş ve verdiği kopyasını sadece çıkış değeri. Çok verimli değil, ama eğer sırf anlatımcılık, para ilgileniyorsanız daha fazla foldr daha sunuyor. Eğer bunu kullanırsanız para safeTail foldrkodlu sürüm doğrusal zaman, eleman tarafından kuyruk öğe kopyalama alacak.

Bu yüzden, işte bu: para listenin kuyruk anında erişim yanı sıra değeri hesaplanan veren foldr daha kolay bir versiyonu.

Genel durumda, bir veri türü ile çalışan bir functor özyinelemeli fixpoint elde etti

data Fix f = In (f (Fix f))

var

cata :: Functor f => (f         t  -> t) -> Fix f -> t
para :: Functor f => (f (Fix f, t) -> t) -> Fix f -> t

cata phi (In ff) = phi (fmap (cata phi) ff)
para psi (In ff) = psi (fmap keepCopy   ff) where
  keepCopy x = (x, para psi x)

ve yine, bu iki karşılıklı olarak tanımlanabilir, para aynı cata "kopya" hile . yapmak tanımlı ile

para psi = snd . cata (\ fxt -> (In (fmap fst fxt), psi fxt))

Yine para eğer giriş altyapılar için kolay erişim gerekiyorsa cata ama daha rahat, daha etkileyici.

Düzenleme:Diğer güzel bir örnek hatırladım.

İkili arama ağaçları Fix TreeF tarafından verilen nerede düşünün

data TreeF sub = Leaf | Node sub Integer sub

para ** 45, sonra ikili arama ağaçları için ekleme, ilk tanımlayan deneyin. Her düğüm bir alt takın ama olduğu gibi diğer korumak için ihtiyacınız olacak gibi para sürümü çok daha kolay.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • RocketJump

    RocketJump

    22 ŞUBAT 2006
  • wowchick16

    wowchick16

    17 Mart 2007