现在,Haskell图书馆中可能有某些事情可以做我想要的。我有足够的菜鸟不知道会更好,并且我正尝试使用我所知道的工具编写自定义 map 函数。类型签名必须是
myMap :: (Monad m) => (a -> b) -> [m a] -> [m b]
在将
myMap f as
应用于f
中每个Monad中的每个值之后,as
返回一个列表。我的第一次尝试是
myMap f = map (\x x >>= f)
但是,它的类型签名为
myMap :: (Monad m) => (a -> m b) -> [m a] -> [m b]
这是如此接近我所需要的,我可以尖叫。现在,我需要一些有关如何从此处继续的提示。我真的希望它和库函数一样简单,但是我愿意编写自己的简短函数来代替。
相关问题:
Mapping a function over two input lists
最佳答案
如果可以将(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)
关于haskell - 编写自定义 map 功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19216243/