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
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
foldr
kodlu 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.
Arasında belirli farklar nelerdir .ve ...
C yapı ve sınıf arasındaki farklar nel...
HER istemci için tek bir veritabanı ku...
Perl geliştirme için ideal Vim yapılan...
Laravel 4 yardımcıları veya temel fonk...