写了一段时间的代码之后,会觉得,读源码是了解一个东西最好的途径。对于 haskell 暂时没有找到特别好的,可以很直接的办法去跳到库的源码里,所以,目前最好的办法是通过 hoogle 来找到对应方法的 source.
lift 是一个 看上去特别好玩的方法,不管是 scala 还是 haskell 都是写的特别好玩的一个方法。
liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r
liftM f m1 = do { x1 <- m1; return (f x1) }
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }
liftM3 :: (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 f m1 m2 m3 = do { x1 <- m1; x2 <- m2; x3 <- m3; return (f x1 x2 x3) }
liftM4 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4 f m1 m2 m3 m4 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; return (f x1 x2 x3 x4) }
liftM5 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
liftM5 f m1 m2 m3 m4 m5 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; return (f x1 x2 x3 x4 x5) }
lift 的意思,其实没有那么复杂,只是把一个 f apply 给一个 绑定 Monad 的值,并且,返回的结果绑在 monad 的里。
liftM2 (+) [0,1] [0,2] = [0,2,1,3]
list 也是一个 monad ,蛤蛤
网友评论