road to haskell (1)

  写了一段时间的代码之后,会觉得,读源码是了解一个东西最好的途径。对于 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 ,蛤蛤

你可能感兴趣的:(road to haskell (1))