Ücretsiz bir foo, tüm 'foo' yasalarını karşılayan en basit şeydir. Yani, bir foo olmak için gerekli yasaları tam olarak karşılar ve ekstra bir şey değildir.
Unutkan bir işlev, bir kategoriden diğerine geçerken yapının bir kısmını "unutan" işlevdir.
Verilen fanktorlar F : D -> C
ve G : C -> D
deriz F -| G
, F
eşlenik bırakılır G
, ya G
doğru esleniktir F
forall a, b zaman: F a -> b
izomorftur a -> G b
oklar uygun kategorilerdeki nereden geldiğini.
Resmi olarak, serbest bir işlev unutkan bir işleve bitişik bırakılır.
Ücretsiz Monoid
Daha basit bir örnekle başlayalım, ücretsiz monoid.
Bazı operatörler kümesi tarafından tanımlanan bir Monoid ele alalım T
, bir ikili işlev birlikte bir çift elemana püre için f :: T → T → T
, ve bir unit :: T
bir ilişkisel yasası ve kimlik kanunu var, öyle ki,: f(unit,x) = x = f(x,unit)
.
Bir functor yapabilirsiniz U
(onlar harita sağlamak oklar olduğunu, monoid homomorfizmleri nerede Monoids kategorisinden unit
için unit
diğer Monoid üzerinde ve anlam değiştirmeden diğer Monoid için haritalama önce ya da sonra oluşturabileceği) kategorisine (okların sadece işlev okları olduğu) ve işlem hakkında 'unutulan' unit
ve sadece taşıyıcı kümesini veren kümelerden oluşur .
Daha sonra, F
kümeler kategorisinden, bu işleve bitişik kalan monoidler kategorisine geri dönen bir işlev tanımlayabilirsiniz . Bu işlev, bir seti a
monoid [a]
, nerede unit = []
ve ile eşleyen işlevdir mappend = (++)
.
Şimdiye kadar sözde Haskell'deki örneğimizi gözden geçirmek için:
U : Mon → Set -- is our forgetful functor
U (a,mappend,mempty) = a
F : Set → Mon -- is our free functor
F a = ([a],(++),[])
O zaman göstermek F
ücretsizdir, U
unutulmaz bir fontöre bitişik olduğunu , yani yukarıda belirttiğimiz gibi, şunu göstermeliyiz
F a → b
izomorfik a → U b
şimdi, hedefin, okların monomorfizmalar olduğu monoidler F
kategorisinde Mon
olduğunu hatırlayın, bu yüzden bir monoid homomorfizmanın [a] → b
tam olarak bir fonksiyonla tanımlanabileceğini göstermemiz gerekir a → b
.
Haskell'de, sadece listeler için uzmanlaştığında tipte olan Set
(er, Hask
taklit ettiğimiz Haskell türleri kategorisi Set) olan tarafını çağırıyoruz .foldMap
Data.Foldable
Monoid m => (a → m) → [a] → m
Bunun bir sıfat olmasıyla ortaya çıkan sonuçlar vardır. Özellikle unutursanız, ücretsiz olarak inşa ederseniz, tekrar unutun, tıpkı bir kez unuttuğunuz gibi ve bunu monadik birleşmeyi oluşturmak için kullanabiliriz. çünkü UFUF
~ U(FUF)
~ UF
ve biz gelen kimlik monoid homomorfizmasının geçirebilirsiniz [a]
için [a]
bizim birleşim tanımlayan isomorphism aracılığıyla, bir liste İzomorfizma olsun [a] → [a]
türde bir fonksiyonudur a -> [a]
ve bu sadece listeler için iade edilir.
Bu terimlerdeki bir listeyi şu şekilde açıklayarak bunların tümünü daha doğrudan oluşturabilirsiniz:
newtype List a = List (forall b. Monoid b => (a -> b) -> b)
Ücretsiz Monad
Yani bir şeydir Ücretsiz Monad ?
Daha önce yaptığımızla aynı şeyi yapıyoruz, okların monad homomorfizmaları olduğu monad kategorisinden okların doğal dönüşümler olduğu bir endofunktör kategorisine unutulmaz bir fonktör U ile başlıyoruz ve bitişik kalan bir fonktor arıyoruz. Buna.
Peki, bu genellikle kullanıldığı gibi bir serbest monad kavramı ile nasıl ilişkilidir?
Bir şeyin özgür bir monad olduğunu bilmek Free f
, size bir monad homomorfizması Free f -> m
vermenin doğal bir dönüşüm (functor homomorfizması) vermekle aynı şey (izomorfik) olduğunu söyler f -> m
. Unutmayın F a -> b
ki a -> U b
, F'nin U'ya bitişik kalması için F'nin izomorfik olması gerekir .
F, en azından hackage paketinde Free
kullandığım tipe göre izomorfik free
.
Ayrıca, ücretsiz liste için yukarıdaki koda daha sıkı bir şekilde benzeterek,
class Algebra f x where
phi :: f x -> x
newtype Free f a = Free (forall x. Algebra f x => (a -> x) -> x)
Eşsiz Comonad'lar
Unutkan bir fontöre doğru bir şekilde bitişik olarak var olduğunu düşünerek benzer bir şey inşa edebiliriz. Eşsiz bir functor basitçe / sağa bitişiktir / unutkan bir functordur ve simetriyle, bir şeyin cofree bir comonad olduğunu bilmek, bir comonad homomorfizması w -> Cofree f
vermenin doğal bir dönüşüm vermekle aynı şey olduğunu bilmekle aynıdır w -> f
.