2012-10-13 36 views
6

Çoğunlukla pratik bir adamım ama bunu ilginç buluyorum.Fonksiyonel Programlamada Dizilimi Anlama

Monadik sıralama hakkında düşünüyordum ve açıklığa ihtiyacım olan birkaç adet var. Yani aptal görünme riski burada öyle:

bind :: m b -> (b -> m c) -> m c

size ara değerlere açık erişim sağlayarak "eylemleri" sırası olabilir

monadic üye bağlanır. Ben sırası olabilir Bununla

(.) :: cat b c -> cat a b -> cat a c

ve ara değerlere erişebilirsiniz:

Bu nasıl kategorik üye (.) bana daha fazla veriyor. Tüm (f . g) x = f(g (x)).

(.) ile sıralı hale getirebiliyorsam, sıralama için neden bind'a ihtiyacım var?

+3

'arasında monadik versiyonu' (> =>) :: Monad m => (.) Ile (a -> mb) -> (b -> mc) -> (a -> mc) ', Kleisli bileşimi. –

+4

Bu size * daha az * verir. C (a, b) = a -> m b ',' bind 'terimiyle bir kategori oluşturur ve kimlik olarak "döndür", "m" nin Kleisli kategorisi *. –

+4

Ayrıca 'f (g x)' 'g x''de ilk önce olması gerektiği doğru değildir. Bu sadece katı anlamlar altında doğru olurdu. Ancak, durduğu gibi, daha önce olsa da olmasa da olabilirdi. – Ingo

cevap

14

Doğru yoldasınız. Her monad Kleisli category sözde yükselir. Her monadın için m karşılık gelen Kleisli kategorisi oklar a -> m b vardır ve

f >=> g  = \x -> f x >>= g 

Kleisli tipi Haskell tipi sisteminde bu kapsüller gibi tanımlanmıştır >=> kullanılarak oluşabilir, bunun bir örneği

instance Monad m => Category (Kleisli m) where 
    id = Kleisli return 
    (Kleisli f) . (Kleisli g) = Kleisli (g >=> f) 
sahip olduğunu görebilir

Bu kategorideki sıralı hesaplamalar, >>= kullanılarak eşzamanlı olarak ifade edilebilen >=> kullanılarak yalnızca sıralama işlemidir.

Biz daha uygun olduğu için return ve >>= kullanarak monads tanımlamak, ama biz istediğimiz takdirde return ve >=> kullanarak onları da tanımlayabiliriz.

(aynı zamanda Different ways to see a monad için my answer bakınız.)

+4

Yazıyordum ama beni ona yendiniz, bu yüzden Monad yasalarının "Kleisli m" yi bir kategori yapan yasalara eşdeğer olduğunu ekleyeceğim: kimliğin sol ve sağ emilimi ve kompozisyonun birliği. Ayrıca, 'ArrowApply'' bir 'Arrow'un bir monad vermesi gereken ekstra yapıyı da tanımladığını unutmayın. “Kleisli m” sadece bir kategori değil, bir “Ok” ve elbette fazladan 'ArrowApply' yapısına sahiptir, fakat tüm Arrow'ların yaptığı bir şey değildir. – pigworker

+0

@pigworker: Yasalar% 100 eşdeğeri değil, ek bir '(g> => h) eklemeniz gerekiyor. f = (f.g)> => h 'yasası' >> = 'yasalarını'> => 'olanlardan çıkarmak için.Bunun ne olduğunu hatırlamıyorum ama bazı egzersizler yaparken beni yakaladı. – hugomg