Abréviation, pour une liste commune de l'opération
Les suivantes sont équivalentes:
concat $ map f list
concatMap f list
list >>= f
Modifier
Depuis, plus de détails ont été demandés...
concat :: [[a]] -> [a]
concat
prend une liste de listes et les concatène dans une seule liste.
map :: (a -> b) -> [a] -> [b]
map
cartes d'une fonction sur une liste.
concatMap :: (a -> [b]) -> [a] -> [b]
concatMap
est équivalent à (.) concat . map
: carte d'une fonction sur une liste, et de les enchaîner les résultats.
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
Un Monad
a un bind de l'opération, qui s'appelle >>=
en Haskell (ou de ses sucrées do
-l'équivalent). Liste, aka []
, est une Monad
. Si l'on substitue []
pour m
ci-dessus:
instance Monad [] where
(>>=) :: [a] -> (a -> [b]) -> [b]
return :: a -> [a]
Quelle est la chose naturelle pour l' Monad
des opérations à faire sur une liste? Nous avons pour satisfaire la monade lois,
return a >>= f == f a
ma >>= (\a -> return a) == ma
(ma >>= f) >>= g == ma >>= (\a -> f a >>= g)
Vous pouvez vérifier que ces lois tenir si nous utilisons la mise en œuvre
instance Monad [] where
(>>=) = concatMap
return = (:[])
return a >>= f == [a] >>= f == concatMap f [a] == f a
ma >>= (\a -> return a) == concatMap (\a -> [a]) ma == ma
(ma >>= f) >>= g == concatMap g (concatMap f ma) == concatMap (concatMap g . f) ma == ma >>= (\a -> f a >>= g)
C'est, en fait, le comportement de l' Monad []
. Comme une démonstration,
double x = [x,x]
main = do
print $ map double [1,2,3]
-- [[1,1],[2,2],[3,3]]
print . concat $ map double [1,2,3]
-- [1,1,2,2,3,3]
print $ concatMap double [1,2,3]
-- [1,1,2,2,3,3]
print $ [1,2,3] >>= double
-- [1,1,2,2,3,3]