编写自定义地图功能

Cod*_*ice 2 monads haskell

现在Haskell库中可能有一些东西可以做我想要的.我已经足够了一个菜鸟,不知道更好,我正在尝试使用我所知道的工具编写自定义地图功能.类型签名需要

myMap :: (Monad m) => (a -> b) -> [m a] -> [m b]
Run Code Online (Sandbox Code Playgroud)

myMap f as应用f每个Monad中的每个值后返回一个列表as.

我的第一次尝试是

myMap f = map (\x x >>= f)
Run Code Online (Sandbox Code Playgroud)

但是,它具有类型签名

myMap :: (Monad m) => (a -> m b) -> [m a] -> [m b]
Run Code Online (Sandbox Code Playgroud)

这非常接近我的需要,我可以尖叫.现在我需要一些如何从这里继续的提示.我真的希望它像库函数一样简单,但我愿意编写自己的短函数来代替它.

相关问题:

将函数映射到两个输入列表

Nei*_*own 5

如果你可以将你的(a -> b)功能转换为m a -> m b你可以map自己使用.那么,你需要做什么呢?Hoogle非常适合这类事情.进行搜索(a -> b) -> (m a -> m b)会得到以下结果:

http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+%28m+a+-%3E+m+b%29

靠近顶部fmap(使用Functor)和liftM(使用Monad).要么会这样做,但你要使用monad,所以让我们一起去吧liftM.从而:

myMap :: Monad m => (a -> b) -> [m a] -> [m b]
myMap f = map (liftM f)
Run Code Online (Sandbox Code Playgroud)