liftM与原始复制

Car*_*s00 3 haskell ghc

replicate 3 "hi"
Run Code Online (Sandbox Code Playgroud)

产生

["hi", "hi", "hi"]
Run Code Online (Sandbox Code Playgroud)

liftM (replicate 3) "hi"
Run Code Online (Sandbox Code Playgroud)

产生

["hhh", "iii"]
Run Code Online (Sandbox Code Playgroud)

如何liftM操作(准确地)?

Die*_*Epp 7

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

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

脚注

*liftM和之间fmap的区别是不同的类背景,因为由于历史原因,Monad并不意味着Functor.


huo*_*uon 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.liftMfor lists 的定义相当于map(两个函数具有相同的类型,这是一个很大的提示.)因此:

liftM (replicate 3) ['h','i'] = map (replicate 3) ['h','i']
     = [replicate 3 'h', replicate 3 'i'] = ["hhh","iii"]
Run Code Online (Sandbox Code Playgroud)