Bu mesaja Mac Lane'nin Çalışan Matematikçi Kategorisi Teorisinin rezil teklifinin çıkarımını daha iyi anlayarak geldim .
Bir şeyin ne olduğunu tarif ederken, ne olmadığını tanımlamak genellikle eşit derecede faydalıdır.
Mac Lane'in açıklamayı bir Monad'ı tanımlamak için kullanması, monadlara özgü bir şeyi tanımladığı anlamına gelebilir. Benimle ayı. İfadesinin daha geniş bir anlayış geliştirmek için, ben onun olduğunu açıkça belirtmek gerekir inanıyoruz değil için, monadlara özgü bir şeyi tarif ; ifadede diğerleri arasında Uygulayıcı ve Oklar eşit olarak açıklanmaktadır. Aynı nedenle Int (Sum ve Product) üzerinde iki monoidimiz olabilir, endofunktörler kategorisinde X üzerinde birkaç monoidimiz olabilir. Ancak benzerliklerden daha fazlası da var.
Hem Monad hem de Uygulayıcı kriterleri karşılar:
İfadede "Kategori ..." kullanılır. Bu ifadenin kapsamını tanımlar. Bir örnek olarak, Funktör Kategori kapsamını tanımlayan f * -> g *
, yani, Any functor -> Any functor
örneğin, Tree * -> List *
ya da Tree * -> Tree *
.
Kategorik bir ifadenin belirtmediği, bir şeye ve her şeye nerede izin verildiğini açıklar .
Bu durumda, functorların içinde * -> *
aka a -> b
belirtilmez Anything -> Anything including Anything else
. Hayal gücüm Int -> String'e atlarken, aynı zamanda, Integer -> Maybe Int
hatta Maybe Double -> Either String Int
nerede olduğunu da içerir a :: Maybe Double; b :: Either String Int
.
Yani ifade şöyle bir araya geliyor:
- işlev kapsamı
:: f a -> g b
(yani, herhangi bir parametreli türe herhangi bir parametreli tip)
- endo + functor
:: f a -> f b
(yani, aynı parametreli türe herhangi bir parametreli tip) ... farklı dedi,
- endofunctor kategorisinde bir monoid
Peki, bu yapının gücü nerede? Tam dinamikleri takdir etmek için, bir monoid'in (kimlik okuna benzeyen tek bir nesne) tipik çizimlerinin, herhangi bir sayıda monoid değeri :: single object -> single object
ile parametreleştirilmiş bir oku kullanmama izin verdiğini gösteremediğini görmem gerekiyordu , adlı tek tip bir nesne Monoid izin. Eşdeğerlik endo, ~ kimlik oku tanımı , işlevin tür değerini ve en içteki "yararlı yük" katmanının türünü ve değerini göz ardı eder . Böylece denklik , işlev türlerinin eşleştiği herhangi bir durumda geri döner (örneğin, her ikisi de olduğu için eşdeğerdir ).true
Nothing -> Just * -> Nothing
Just * -> Just * -> Just *
Maybe -> Maybe -> Maybe
Kenar çubuğu: ~ dış kavramsal, ancak içinde en soldaki simgedir f a
. Aynı zamanda "Haskell" in önce ne okuduğunu da açıklar (büyük resim); bu nedenle Tür, bir Tür Değerine göre "dış" tır. Programlamada katmanlar (bir referanslar zinciri) arasındaki ilişkinin Kategori içinde ilişkilendirilmesi kolay değildir. Küme Kategorisi, Functor Kategorisini (parametreleştirilmiş Türler) içeren Türleri (Int, Dizeler, Belki Int vb.) Tanımlamak için kullanılır. Referans zinciri: Functor Tipi, Functor değerleri (bu Functor kümesinin öğeleri, ör. Nothing, Just) ve sırayla, her functor değerinin işaret ettiği diğer her şey. Kategoride ilişki farklı tarif edilir, örneğin, return :: a -> m a
bir Functor'dan başka bir Functor'a, şimdiye kadar bahsedilenlerden farklı bir doğal dönüşüm olarak kabul edilir.
Sonuçta, herhangi bir tensör ürünü ve nötr bir değer için ana iş parçacığına geri dönersek, deyim paradoksal yapısından doğan şaşırtıcı derecede güçlü bir hesaplama yapısını tarif eder:
- dışarıda tek bir nesne olarak görünür (ör.
:: List
) ; statik
- ama içeride çok fazla dinamiğe izin veriyor
- herhangi bir arity fonksiyonuna yem ile aynı tipte herhangi bir sayıda değer (ör. Empty | ~ NonEmpty). Tensör ürünü, dış katman için herhangi bir sayıda girişi tek bir değere düşürecektir ...
fold
yük hakkında hiçbir şey söylemez)
- sonsuz aralığı her iki en iç tabakasının tip ve değerler
Haskell'de ifadenin uygulanabilirliğinin açıklığa kavuşturulması önemlidir. Güç ve bu yapının yönlülüğü, bir monad ile hiçbir ilgisi yoktur haddi zatında . Başka bir deyişle, yapı bir monad'ı benzersiz kılan şeye dayanmaz.
Birbirine bağlı hesaplamaları, paralel olarak çalıştırılabilen hesaplamaları desteklemek için paylaşılan bir bağlamla kod oluşturup oluşturmayacağınızı anlamaya çalışırken, bu rezil ifade, açıkladığı kadarıyla, seçim arasında bir kontrast değildir. Uygulayıcı, Oklar ve Monadlar, aksine ne kadar aynı olduklarının bir açıklamasıdır. Eldeki karar için ifade tartışmalıdır.
Bu genellikle yanlış anlaşılır. Açıklama join :: m (m a) -> m a
, monoidal endofunktor için tensör ürünü olarak tarif edilmektedir. Ancak, bu ifade bağlamında,(<*>)
da seçilebileceğini . Gerçekten altı / yarım düzine bir örnektir. Değerleri birleştirme mantığı tam olarak aynıdır; aynı girdi, her biri için aynı çıktıyı üretir (Int için Sum ve Product monoidlerinin aksine, Ints birleştirilirken farklı sonuçlar üretir).
Özetlemek gerekirse: Endofunktör kategorisindeki bir monoid şunları açıklar:
~t :: m * -> m * -> m *
and a neutral value for m *
(<*>)
ve (>>=)
her ikisi m
de tek dönüş değerini hesaplamak için iki değere eşzamanlı erişim sağlar . Dönüş değerini hesaplamak için kullanılan mantık tamamen aynıdır. Onlar (parameterize fonksiyonların farklı şekillerde olmasaydı f :: a -> b
karşı k :: a -> m b
(yani) ve hesaplama aynı dönüş türü ile parametrenin pozisyonuna a -> b -> b
karşı b -> a -> b
, sanıyorum biz monoidal mantığı, parametreli olabilirdi her sırasıyla için) Her iki tanımda yeniden kullanım için tensör ürünü. Noktayı bir alıştırma olarak, denemek ve uygulamak ~t
ve ile bitirmek (<*>)
ve (>>=)
bunu tanımlamanız karar nasıl bağlı forall a b
.
Son noktam minimum kavramsal olarak doğruysa, o zaman Uygulamalı ve Monad arasındaki kesin ve sadece hesaplama farkını açıklar: parametreleştirdikleri fonksiyonlar. Başka bir deyişle, farktır harici bu tip sınıfların uygulanmasına.
Sonuç olarak, kendi tecrübelerime göre, Mac Lane'nin rezil alıntısı, Haskell'de kullanılan deyimleri daha iyi anlamak için Kategori boyunca yolumu sürerken referans göstermem için bir rehber olan büyük bir "goto" meme sağladı. Haskell'de mükemmel bir şekilde erişilebilir hale getirilen güçlü bir hesaplama kapasitesinin kapsamını yakalamayı başarıyor.
Ancak, ifadenin monad dışındaki uygulanabilirliğini nasıl ilk yanlış anlamış olduğum ve burada aktardığımı umduğumda ironi var. Açıkladığı her şey, Uygulayıcı ve Monadlar (ve diğerleri arasında Oklar) arasında benzer olan şeydir. Söylemediği şey tam olarak aralarındaki küçük ama kullanışlı ayrımdır.
- E