Haskell语言学习笔记(18)Traversable

来源:互联网 发布:广东省网络问政 编辑:程序博客网 时间:2024/05/24 06:31

Traversable

class (Functor t, Foldable t) => Traversable t where    traverse :: Applicative f => (a -> f b) -> t a -> f (t b)    traverse f = sequenceA . fmap f    sequenceA :: Applicative f => t (f a) -> f (t a)    sequenceA = traverse id    mapM :: Monad m => (a -> m b) -> t a -> m (t b)    mapM = traverse    sequence :: Monad m => t (m a) -> m (t a)    sequence = sequenceA
Traversable是个类型类。

[] 是 Traversable

instance Traversable [] where    traverse f = List.foldr cons_f (pure [])      where cons_f x ys = (:) <$> f x <*> ys
Prelude> traverse (\x -> [0..x]) [0..2][[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2]]Prelude> mapM (\x -> [0..x]) [0..2][[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2]]Prelude> sequenceA [[1,2,3],[4,5]][[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]Prelude> sequence [[1,2,3],[4,5]][[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]Prelude> sequence [[0..2],[0..2],[0..2]][[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2],[0,2,0],[0,2,1],[0,2,2],[1,0,0],[1,0,1],[1,0,2],[1,1,0],[1,1,1],[1,1,2],[1,2,0],[1,2,1],[1,2,2],[2,0,0],[2,0,1],[2,0,2],[2,1,0],[2,1,1],[2,1,2],[2,2,0],[2,2,1],[2,2,2]]Prelude> sequence [Just 1, Just 2, Just 3]Just [1,2,3]Prelude> sequence [Just 1, Nothing, Just 3]NothingPrelude> sequence [getLine, getLine]12["1","2"]Prelude> mapM print [1,2,3]123[(),(),()]
traverse (\x -> [0..x]) [0..2]= foldr cons_f (pure []) [0..2]= cons_f 0 (cons_f 1 (cons_f 2 [[]]))= cons_f 0 (cons_f 1 ((:) <$> [0..2] <*> [[]]))= cons_f 0 (cons_f 1 [[0],[1],[2]])= cons_f 0 ((:) <$> [0..1] <*> [[0],[1],[2]])= cons_f 0 [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2]]= (:) <$> [0..0] <*> [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2]]= [[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2]]traverse (\x -> [0..x]) [0..2]= sequenceA . fmap (\x -> [0..x]) $ [0..2]= sequenceA [[0..0],[0..1],[0..2]]= [[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2]]

Maybe 是 Traversable

instance Traversable Maybe where    traverse _ Nothing = pure Nothing    traverse f (Just x) = Just <$> f x
Prelude> sequence $ Just [1,2,3][Just 1,Just 2,Just 3]Prelude> sequence $ Just (Just 3)Just (Just 3)Prelude> sequence $ Just NothingNothing

for forM 函数

for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b)for = flip traverseforM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)forM = flip mapM
Prelude Data.Traversable> for [1,2,3,4] show["1234"]Prelude Control.Monad> forM [1,2,3,4] print1234[(),(),(),()]
0 0
原创粉丝点击