Früher benutzte es map
und sequence
mit folgenden Umsetzung zu haben:Wie Verallgemeinerung zu tun?
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
sequence :: Monad m => [m a] -> m [a]
dann Mitwirkenden Haskell hat zu verallgemeinern:
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)
Warum sie applicative über Monade wählen?
Wie werden sie die Idee zu verallgemeinern mapM
und sequence
? Ich möchte den Prozess verstehen, wenn ich abstrakter sein muss. Wie Sie sehen können, funktioniert mapM
und sequence
Arbeit nur auf die Liste, aber traverse
und sequenceA
sind abstrakter und arbeiten mit allen Datentyp, der Traversable
umgesetzt hat.
Jede Monade * ist auch * ein applicative, so dass die Wahl applicative können Sie es für andere Dinge verwenden. – MathematicalOrchid
Sie nicht zu viel Sorgen um so viel wie möglich zu verallgemeinern scheitern. Oftmals ist die vollständig allgemeine Abstraktion von konkreten Anwendungen so weit entfernt, dass sie in der Praxis wenig Verwendung finden, da es einfacher wird, das Rad neu zu erfinden, als die abstrakte codierte Transformationskombinatorbibliothek mit kombinatorischer Drehübertragungsvorrichtung zu nutzen. Das Finden der richtigen Ebene der Abstraktion erfordert viel Aufwand und Fähigkeiten. (Und zumindest für theoretische Zwecke ist es sehr schön, super-abstrakte kategorientheoretische Ansätze zu regulären Aufgaben zu lesen und zu verstehen - viele lieben Haskell einfach dafür!) – chi