mam ten kod:Generalizowanie "sekwencji" dla wszystkich funktorów?
fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do
ev <- f e
return (id, ev)
które zasadniczo stosuje funkcję do 2-ej w krotce, a następnie „wyciąg” monady. Skoro krotka jest funktorem, czy istnieje sposób uogólnienia tego dla wszystkich funktorów? Nie mogę myśleć o realizacji, ale podpis typu powinny być:
fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b
wydaje się jak 2. etapu będzie „sekwencja” operacja, która wydobywa monady z innego funktora (listy). Ale sekwencja nie jest uogólniona na wszystkie funktory. Czy możesz wymyślić ogólną implementację fmapM?
Edytuj: Zdałem sobie sprawę, że stara wersja uścisków miała tę funkcję zaimplementowaną. Jednak nie mogę znaleźć kodu. Teraz sugeruje się, że używam składanego/przejezdnego, aby osiągnąć to samo.
Ah, widzę "fmapM", które masz na myśli w starych uściskach, ale to była po prostu mniej ogólna wersja "Traversable". Wciąż jest to klasa z inną implementacją dla każdego typu. – shachaf
(Możesz wyprowadzić 'fmap' - jak również wiele innych funkcji - od samego' ruchu ', ale nie odwrotnie.) – shachaf