Ich möchte über das Applikative Formular mappen.
Der Typ der map-ähnlichen Funktion wäre wie folgt:
mapX :: (Applicative f) => (f a -> f b) -> f [a] -> f [b]
verwendet als:
result :: (Applicative f) => f [b]
result = mapX f xs
where f :: f a -> f b
f = ...
xs :: f[a]
xs = ...
Im Hintergrund dieses Beitrags versuche ich, ein Fluidsimulationsprogramm im Applicative-Stil zu schreiben, unter Bezugnahme auf Paul Haduks "The Haskell School of Expression", und ich möchte die Simulation mit dem Applicative-Stil wie folgt ausdrücken:
x, v, a :: Sim VArray
x = x0 +: integral (v * dt)
v = v0 +: integral (a * dt)
a = (... Berechnung der Beschleunigung mit x v ...)
instance Applicative Sim where
...
wo der Typ Sim den Prozess der Simulationsberechnung bedeutet und VArray Array von Vektoren (x, y, z) bedeutet. X, v a sind die Arrays der Position, Geschwindigkeit und Beschleunigung, bzw.
Das Mapping über die Applikative Form erfolgt bei der Definition von a.
Ich habe eine Antwort auf meine Frage gefunden.
Im Endeffekt stellt sich meine Frage "Wie kann man Hochordnungsfunktionen (wie map :: (a -> b) -> [a] -> [b]) in die Applikative Welt überführen?" und die Antwort, die ich gefunden habe, ist "Sie mit angehobenen Funktionen erster Ordnung zu bauen."
Zum Beispiel wird "mapX" mit angehobenen Funktionen erster Ordnung (headA, tailA, consA, nullA, condA) wie folgt definiert:
mapX :: (f a -> f b) -> f [a] -> f [b]
mapX f xs0 = condA (nullA xs0) (pure []) (consA (f x) (mapA f xs))
where
x = headA xs0
xs = tailA xs0
headA = liftA head
tailA = liftA tail
consA = liftA2 (:)
nullA = liftA null
condA b t e = liftA3 aux b t e
where aux b t e = if b then t else e