现在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)
这非常接近我的需要,我可以尖叫.现在我需要一些如何从这里继续的提示.我真的希望它像库函数一样简单,但我愿意编写自己的短函数来代替它.
相关问题:
如果你可以将你的(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)
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |