Ho questo codice:Generalizzazione "sequenza" per tutti i funtori?
fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do
ev <- f e
return (id, ev)
che si applica fondamentalmente la funzione per il 2 ° elemento della tupla e poi "estratti" monade. Dato che la tupla è un funtore, c'è un modo per generalizzare questo per tutti i funtori? Non riesco a pensare a un'implementazione, ma la firma di tipo dovrebbe essere:
fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b
sembrerebbe come il secondo passo sarebbe un'operazione di "sequenza", che estrae la monade da un altro funtore (la lista). Ma la sequenza non è generalizzata a tutti i funtori. Puoi venire con un'implementazione generica di fmapM?
Modifica: Mi sono reso conto che una vecchia versione di abbracci ha implementato questa funzione. Tuttavia, non riesco a trovare il codice. Ora, si suggerisce di usare pieghevole/attraversabile per ottenere lo stesso risultato.
Ah, vedo 'fmapM' che intendi nei vecchi Hugs, ma quella era solo una versione meno generale di 'Traversable'. È ancora una classe con un'implementazione diversa per ogni tipo. – shachaf
(Puoi derivare 'fmap' - così come molte altre funzioni - da solo' traverse', ma non viceversa.) – shachaf