3
replicate 3 "hi"

生产

["hi", "hi", "hi"]

liftM (replicate 3) "hi"

生产

["hhh", "iii"]

(精确地)如何liftM运作?

4

2 回答 2

7

liftM函数是fmap*的另一个名称,相当于map它对列表进行操作时。

liftM (replicate 3) "hi"
  = [replicate 3 x | x <- "hi"]
  = [replicate 3 'h', replicate 3 'i']
  = ["hhh", "iii"]

脚注

*liftM和之间的区别fmap是不同的类上下文,由于历史原因,Monad并不意味着Functor

于 2012-11-01T22:16:05.423 回答
6

总结:liftM = map


liftM函数具有类型Monad m => (a -> b) -> m a -> m b。也就是说,它在 monad 中接受一个函数和一些东西,并“通过”monad 应用该函数。(或者,以另一种方式看待它,它具有 type Monad m => (a -> b) -> (m a -> m b),即将函数转换为通过 monad 操作的函数。)

在这种情况下,我们有liftM (replicate 3) ['h','i'](记住这"hi"只是单个字符列表的简写),所以有问题的 monad 是 list monad。liftMfor 列表的定义等价于map(两个函数具有相同的类型,这是一个很大的提示。)因此:

liftM (replicate 3) ['h','i'] = map (replicate 3) ['h','i']
     = [replicate 3 'h', replicate 3 'i'] = ["hhh","iii"]
于 2012-11-01T22:18:03.533 回答