2014-04-15 16 views

Odpowiedz

6

Aby uzyskać szerszy obraz, strzałki usuwają Cię z Hask i do innych kategorii, które chcesz zbadać. Kategoria Kleisli jest prawdopodobnie najlepiej znana Haskellerom, a następnie Cokleisli. Są to naturalne „rozszerzenia” z HASK: dodać endofunctor wokół obu wyniku lub argumentów, a następnie dostać kategorię ponownie jeśli

  • Kleisli: funktor jest monada, więc id ≅ return :: a -> m a

    (.) ≅ (<=<) :: (b->m c) -> (a->m b) -> a->m c 
    
  • CoKleisli: funktor jest comonad, więc id ≅ coreturn :: m a -> a i

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

(Dla tego nie potrzebujesz jeszcze Arrow, tylko Category. Ale ogólne kategorie nie są bardzo ciekawe, zazwyczaj chcą monoidal lub nawet kartezjański zamknięte kategorię, która jest co Arrow jest grubsza zmierzające).

Ale istnieje pewien wiele other categories.Większość nie ma wiele wspólnego z Hask i nie może być wyrażona standardową klasą Arrow, głównie dlatego, że obiekty mają specjalne właściwości, które nie spełniają wszystkie typy Haskell. W rzeczywistości, jeśli dodasz możliwość ograniczania typów obiektów, the possibilities immediately become much wider. Ale nawet jeśli pozostaniesz przy standardowych klasach, może nawet po prostu w ->, pozbawiony punktu styl kompozycji, który jest naturalny ze strzałami, często wychodzi bardzo ładnie, zwięźle i otwiera nowe sposoby myślenia o transformacjach.

3

Funkcje są tylko instancją strzałek, jest to jak pytanie "Dlaczego używać monad zamiast tylko Maybe".

Wszystko, co można zrobić za pomocą strzałek, można oczywiście wykonać za pomocą funkcji, ponieważ instancja Arrow (->) może mówić tylko o jednej małej części funkcji, a mianowicie o klasie typu Arrow. Jednak strzałki mają więcej instancji niż zwykłych funkcji, więc możemy używać funkcji ssame do operowania na bardziej złożonych typach.

Strzały są ładne, ponieważ mogą mieć o wiele więcej konstrukcji niż tylko funkcję, podczas przechodzenia z zaledwie fmap, nie mamy sposobu na zbieranie efektów, są bardziej wyraziste niż monady! Rozważmy strzałkę Kleisli,

newtype Kleisli m a b = Kleisli {runKleisli :: a -> m b} 

To tworzy strzałkę, gdy m jest monadą. Tak więc każdy Monad tworzy strzałkę, a tym samym możemy budować monadyczne obliczenia, płynnie komponując a -> m b i zrobić wiele przydatnych rzeczy, takich jak to. Niektóre biblioteki XML używają strzałek do abstrakcji nad funkcjami od elementu do jego podelementów i używają go do przechodzenia przez dokument. Inne parsery używają strzałek (ich pierwotny cel), choć obecnie wydaje się, że to nie jest korzystne dla Applicative.

Zauważyliśmy, że strzałki są bardziej ogólne, gdy mówimy tylko o strzałkach, unikamy duplikowania całego kodu, który powinniśmy napisać, aby zrobić coś z naszymi parserami, skrobakami xml i monadycznymi Funkcje!

To tak samo, jak na Monad przez Maybe, tracimy trochę mocy, ponieważ nie jesteśmy już w stanie wydawać konkretnych oświadczeń, ale w zamian otrzymujemy bardziej ogólny kod.