2012-10-13 10 views
6

Jestem głównie praktycznym facetem, ale uważam to za interesujące.Zrozumienie sekwencjonowania w programowaniu funkcjonalnym

Myślałem o monadycznym sekwencjonowaniu i jest kilka rzeczy, które muszę wyjaśnić. Więc na ryzyko brzmiące głupie tutaj to:

monadycznego członkiem wiążą

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

może sekwencji „działania” daje dostęp do wyraźnej wartości pośrednich.

Jak to dać mi więcej niż kategorycznego członka (.):

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

Z tego mogę kolejności i uzyskać dostęp do wartości pośrednich. Po wszystkim (f . g) x = f(g (x)).

Dlaczego potrzebuję bind do sekwencjonowania, czy mogę sekwencjonować z (.)?

+3

The jednowartościowy wersję '' 'jest (> =>) :: Monad m => (.) (A -> mb) -> (b -> mc) -> (a -> mc) ', kompozycja Kleisli. –

+4

To daje * mniej * faktycznie. 'C (a, b) = a -> m b' tworzy kategorię z" bind "jako kompozycją i' return' jako tożsamość, kategorią * Kleisli * z 'm'. –

+4

Nie jest też do końca prawdą, że w 'f (gx)' 'gx' musi się najpierw wydarzyć. Byłoby to prawdą tylko pod ścisłą semantyką. Ale w obecnej postaci może być przed, albo w ogóle. – Ingo

Odpowiedz

14

Jesteś na dobrej drodze. Każda monada daje początek tak zwanemu Kleisli category. Dla każdej monady m odpowiadającej jej kategorii Kleisli ma strzałki a -> m b i mogą składać się z użyciem >=>, który jest zdefiniowany jako

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

Kleisli typ oddaje to w systemie typu Haskell, można zobaczyć, że ma instancję

instance Monad m => Category (Kleisli m) where 
    id = Kleisli return 
    (Kleisli f) . (Kleisli g) = Kleisli (g >=> f) 

Tak więc obliczenia sekwencyjne w tej kategorii są po prostu operacjami sekwencyjnymi przy użyciu >=>, które można wyrazić równoważnie przy użyciu >>=.

Definiujemy monads użyciu return i >>= ponieważ jest to bardziej wygodne, ale możemy je zdefiniować, jak również za pomocą return i >=> jeśli chcieliśmy.

(Patrz również my answer do Different ways to see a monad.)

+4

Pisałem dalej, ale mnie biłeś, więc dodam, że prawa Monada są równoważne prawom, które powodują, że "Kleisli m" to kategoria: prawidłowa i prawidłowa absorpcja tożsamości i asocjatywność kompozycji. Zauważ też, że 'ArrowApply' określa dodatkową strukturę, którą musi posiadać' Arrow', aby uzyskać monadę. 'Kleisli m' to nie tylko kategoria, ale' strzałka' i oczywiście posiada dodatkową strukturę 'ArrowApply', ale nie wszystkie' Arrow's. – pigworker

+0

@pigworker: Prawa nie są w 100% równoważne, ponieważ musisz dodać dodatkowe '(g> => h). f = (f.g)> => h' law, aby wywnioskować prawa '>> =' z '> =>'.Nie pamiętam, jak to się nazywa, ale przydało mi się to podczas ćwiczeń. – hugomg

Powiązane problemy