Ich habe diesen Code:Verallgemeinern der "Sequenz" für alle Funktoren?
fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do
ev <- f e
return (id, ev)
, die im Grunde die Funktion in dem Tupel dem zweiten Element gilt und dann „Extrakte“ die Monade. Da das Tupel ein Funktor ist, gibt es eine Möglichkeit, dies für alle Funktoren zu verallgemeinern? Ich kann eine Implementierung nicht denken, aber die Art Unterschrift sein sollte:
fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b
es wie der zweite Schritt scheinen würde eine „Sequenz“ Operation wäre, der die Monade Auszüge aus einem anderen Funktors (die Liste). Aber die Reihenfolge ist nicht für alle Funktoren verallgemeinert. Können Sie eine generische Implementierung von fmapM erstellen?
Bearbeiten: Ich habe festgestellt, dass eine alte Version von Umarmungen diese Funktion implementiert hatte. Ich kann den Code jedoch nicht finden. Jetzt wird vorgeschlagen, dass ich faltbar/traversable benutze, um dasselbe zu erreichen.
Ah, ich sehe die 'fmapM' Sie in alten Umarmungen bedeuten, aber das war nur eine weniger allgemeine Version von' Traversable'. Es ist immer noch eine Klasse mit einer anderen Implementierung für jeden Typ. – shachaf
(Sie können 'fmap' - wie auch viele andere Funktionen - von' traverse' ableiten, aber nicht umgekehrt.) – shachaf