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 = sequenceATraversable是个类型类。
[] 是 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
- Haskell语言学习笔记(18)Traversable
- Haskell语言学习笔记(1)
- Haskell语言学习笔记(2)
- Haskell语言学习笔记(4)Functor
- Haskell语言学习笔记(5)Applicative
- Haskell语言学习笔记(6)Monad
- Haskell语言学习笔记(8)Monoid
- Haskell语言学习笔记(14)Foldable
- Haskell语言学习笔记(16)Alternative
- Haskell语言学习笔记(17)MonadPlus
- Haskell语言学习笔记(21)Array
- Haskell语言学习笔记(22)MaybeT
- Haskell语言学习笔记(29)CPS
- Haskell语言学习笔记(31)ListT
- Haskell语言学习笔记(35)Contravariant
- Haskell语言学习笔记(39)Category
- Haskell语言学习笔记(42)Bifunctor
- Haskell语言学习笔记(45)Profunctor
- 下载Spark并在单机模式下运行它
- Android基础 Android应用内多进程分析和研究
- 设计模式之观察者模式
- ipc连接常见问题
- Spring+Myecilpse+SqlServer2012配置(+C3P0)
- Haskell语言学习笔记(18)Traversable
- java云停车场后台
- Ubuntu14.01忘记root密码解决方案
- 支付宝支付
- 如何在SYSTEM权限下实现屏幕监控
- 递归1,2,5=100
- 卡尔曼滤波和matlab实现
- JAVAse——核心
- Java实现动态代理