İşlevsel programlamada Muz bölünmesi ve füzyonu nedir?


22

Bu şartlar üniversite dersimde belirtildi. Çabuk googling beni bazı üniversite belgelerine işaret etti, ancak basit bir açıklama arıyorum.


@jozefg: Gönderinizdeki bağlantı için teşekkür ederiz. Bununla ilgili bir soru. Cümlede "Bu anlamda bir cebir C nesnesinin bir çifti ve bir FC → C haritasıdır", C'nin gerçekten bir nesne mi yoksa bir kategori mi olması gerekiyor? Başka bir deyişle, F'nin bir kategorideki bir functor'u gösterip göstermediğinden emin değilim ve F-cebirleri, F'nin bir nesneden kendine özgü bir ok olması durumunda, o functor tarafından indüklenen cebirlerdir.
Giorgio

CBazı kategori (diyelim diyelim ki bir nesnedir CC), Fbir funktor olan CC -> CCbu haritalar, böylece CCkendi üzerine. Şimdi F CC -> CCsadece kategorideki normal bir ok CC. Bir Yani Fcebir bir nesnedir C : CCve bir ok F C -> CiçindeCC
Daniel Gratzer

Yanıtlar:


4

Daha önce 2 cevap verilmiş olmasına rağmen, "muzlu bölünme" nin henüz burada açıklanmadığını sanmıyorum.

Gerçekten de "Muz, Lens, Zarf ve Dikenli Tel ile Fonksiyonel Programlama, Erik Meijer Maarten Fokkinga, Ross Paterson, 1991"; Squiggol'ün yoğun kullanımı nedeniyle bu makalenin okunması zor (benim için). Bununla birlikte, "Rolün evrenselliği ve ifadesi üzerine bir öğretici olan Graham Hutton, 1999" ayrıştırılması daha kolay olan bir tanım içeriyor:

Tüfe üretmek için katlamanın kullanımının basit bir ilk örneği olarak, bir sayılar listesinin toplamını ve uzunluğunu hesaplayan fonksiyonun toplamını düşünün :

sumlength :: [Int] → (Int,Int)
sumlength xs = (sum xs, length xs)

İşlevleri tanımlarının basit bir kombinasyonu ile toplamı ve uzunluğu kullanılarak kat daha önce verilen, fonksiyon sumlength tek bir uygulama olarak yeniden edilebilir kat bu numaralar listesinden bir sayı çifti oluşturur:

sumlength = fold (λn (x, y) → (n + x, 1 + y)) (0, 0)

Bu tanım orijinal tanımdan daha etkilidir, çünkü iki ayrı traversal yerine sadece argüman listesi üzerinde tek bir geçiş yapar. Bu örnekten genelleme, uygulamaları herhangi bir çift kat aynı listesine her bir tek uygulama vermek için birleştirilebilir kat arasında 'muz bölünmüş' olarak adlandırılan özelliğine başvurarak, bu çifti oluşturur kat (Meijer, 1992) . Bu özelliğin garip ismi, katlama operatörünün bazen muzlara benzeyen parantezler (| |) kullanılarak yazılmasından ve eşleştirme operatörünün bazen bölünmüş olarak adlandırılmasından kaynaklanmaktadır. Bu nedenle, onların kombinasyonu muz bölünmüş olarak adlandırılabilir!


19

Bu aslında Yani bir "denilen Meijer ve birkaç başkaları tarafından bir kağıda başvurulan Muz, Lensler, Zarflar ve Dikenli telle Fonksiyonel Programlama ", temel fikir biz söz hakkından gibi herhangi özyinelemeli veri türünü alabilir olmasıdır

 data List = Cons Int List | Nil

ve özyinelemeyi bir tür değişkenine ayırabiliriz

 data ListF a = Cons Int a | Nil

Bunu eklememin sebebi bunun Fbir functor olduğudur. Ayrıca listeleri taklit etmemize de izin verir, ancak bir bükümle: listeleri oluşturmak için liste türünü yerleştirmeliyiz

type ThreeList = ListF (ListF (ListF Void)))

Orijinal listemizi kurtarmak için, bunu sonsuz bir şekilde yuvalamaya devam etmemiz gerekiyor . Bu bize bir tür verecektir ListFFnerede

  ListF ListFF == ListFF

Bunu yapmak için bir "sabit nokta tipi" tanımlayın

  data Fix f = Fix {unfix :: f (Fix f)}
  type ListFF = Fix ListF

Bir egzersiz olarak, bunun bizim yukarıdaki denklemimize uyduğunu doğrulamalısınız. Şimdi nihayetinde muzların (catamorfizmlerin) ne olduğunu tanımlayabiliriz!

  type ListAlg a = ListF a -> a

ListAlgs "list cebir" tipidir ve belirli bir işlevi tanımlayabiliriz

  cata :: ListAlg a -> ListFF -> a
  cata f = f . fmap (cata f) . unfix

Daha fazla

  cata :: ListAlg a -> ListFF -> a
  cata :: (Either () (Int, a) -> a) -> ListFF -> a
  cata :: (() -> a) -> ((Int, a) -> a) -> ListFF -> a
  cata :: a -> (Int -> a -> a) -> ListFF -> a
  cata :: (Int -> a -> a) -> a -> [Int] -> a

Tanıdık görünmek? catakesinlikle doğru kıvrımlarla aynıdır!

Asıl ilginç olan, bunu sadece listelerden daha fazlasını yapabilmemiz, bu "bir functorun sabit noktası" ile tanımlanmış herhangi bir türün sahip olması catave bir tür imzaya gevşetmek için elimizden geleni yapmasıdır.

  cata :: (f a -> a) -> Fix f -> a

Bu aslında hakkında yazdığım bir kategori kuramından ilham alıyor , ancak bu Haskell tarafının eti.


2
o söz değer olduğunu muz olduğu (| |) orijinal kağıt kullanır Cata tanımlamak için o parantez
jk.

7

Jozefg cevap vermesine rağmen, soruyu cevaplayıp yanıtlamadığından emin değilim. "Füzyon kanunu" aşağıdaki yazıda açıklanmıştır:

Kıvrımlılığın evrenselliği ve etkileyiciliği üzerine bir öğretici, GRAHAM HUTTON, 1999

Temel olarak, bazı şartlar altında bir fonksiyonun bileşimini birleştirebileceğiniz ("sigorta") ve tek bir kat halinde katlayabileceğiniz, yani

h · kat gw = kat fv

Bu eşitlik için şartlar

hw = v
h (gxy) = fx (hy)

"Muz bölünmesi" veya "Muz bölünmesi yasası" makaleden alınmıştır.

Muz, Lens, Zarf ve Dikenli Tel ile Fonksiyonel Programlama, Erik Meijer Maarten Fokkinga, Ross Paterson, 1991

Ne yazık ki, Bird-Meertens'in formalizmini kullandığı için makaleyi deşifre etmek çok zordur; "Muz bölünmüş yasasını" anladığım kadarıyla, aynı argüman üzerinde çalışan 2 katınız varsa, tek bir kat halinde birleştirilebileceklerini söylüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.