Ich bin neu bei Haskell und bin rätselhaft darüber, wie man einige Operationen am besten auf die idiomatische und klare Art ausdrücken kann. Momentan (es wird noch mehr geben) rätsele ich über <*>
(ich bin mir nicht einmal sicher, wie ich das nennen soll).Haskell Applicative Idiom?
Zum Beispiel, wenn ich, sagen
f = (^2)
g = (+10)
als repräsentative Funktionen (in der Praxis werden sie komplexer sind, aber der Schlüssel ist dabei, dass sie verschieden sind und verschieden sind), dann
concatMap ($ [1,2,3,4,10]) [(f <$>), (g <$>) . tail . reverse]
und
concat $ [(f <$>), (g <$>) . tail . reverse] <*> [[1,2,3,4,10]]
erreichen die gleiche Sache.
Ist einer dieser mehr idiomatischen Haskell, impliziert man etwas, ein erfahrener Leser von Haskell, dass der andere nicht. Vielleicht gibt es zusätzliche (bessere) Möglichkeiten, genau das Gleiche auszudrücken. Gibt es konzeptionelle Unterschiede zwischen den beiden Ansätzen, die ein Anfänger Haskeller wie ich vielleicht fehlt?
Ist Ihre Eingabe immer nur eine Liste sein würde? Wenn ja, ist Ersteres deutlich besser. Mit Eingabe meine ich die Liste der Zahlen. – itsbruce
@itsbruce: Guter Punkt. Ja, immer nur eine einzige Liste. – orome
Das Kombinieren der 'Applicative' oder' Functor' Instanz für Listen mit 'concat' ist sehr verdächtig. 'Functor + return + join = Monad', und für Listen,' concat = join'. Wenn Sie mappen und dann verketten, kann 'concatMap' oder' = << 'prägnanter sein. – dfeuer