mapM
Traversable型クラスのmethodの1つ
traverseのMonad版
定義
code:hs
mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b)
mapM f = unwrapMonad . traverse (WrapMonad . f)
こう書いても同じ
code:hs
mapM f xs = sequence $ fmap f xs
データ構造tと計算コンテナmを入れ替えている
a -> m bにt aを適用するとt (m b)になるが、結果はm (t b)である
直観的な理解
map
code:hs
map (\x -> x * 2) 1,2,3
-- 2,4,6
mapM
code:hs
mapM (\x -> Just (x * 2)) 1,2,3
-- Just 2,4,6
例: 数値を表示しつつ、そのまま返す
code:hs
main :: IO ()
main = do
result <- mapM printAndReturn 1,2,3
print result
printAndReturn :: Int -> IO Int
printAndReturn x = do
print x
return (x * 2)
code:result
1
2
3
2,4,6
関連
mapM_
https://xtech.nikkei.com/it/article/COLUMN/20120207/380292/?P=4
読もう