现在,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/

10-13 06:05