liftM与原始复制

时间:2012-11-01 22:13:17

标签: haskell ghc

replicate 3 "hi"

产生

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

liftM (replicate 3) "hi"

产生

["hhh", "iii"]

liftM如何运作(正是)?

2 个答案:

答案 0 :(得分:7)

liftM函数是fmap * 的另一个名称,当它在列表上运行时相当于map

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

脚注

* liftMfmap之间的差异是不同的类上下文,因为由于历史原因,Monad并不意味着Functor

答案 1 :(得分:6)

摘要:liftM = map


liftM函数的类型为Monad m => (a -> b) -> m a -> m b。也就是说,它需要一个函数和一个monad中的东西并应用“通过”monad的函数。 (或者,从另一个角度来看,它具有类型Monad m => (a -> b) -> (m a -> m b),即它将一个函数转换为一个通过monad运行的函数。)

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

liftM (replicate 3) ['h','i'] = map (replicate 3) ['h','i']
     = [replicate 3 'h', replicate 3 'i'] = ["hhh","iii"]