我目前正在尝试解决20个中级Haskell练习练习,而且我试图在没有使用的情况下尝试实现mapM(moppy在练习中)sequence.
我只能[m b]通过简单的应用来制作,fmap但我不知道如何继续:
moppy :: [a] -> (a -> m b) -> m [b]
moppy la f = furry' f la -- how do I transform [m b] to m [b] without sequence
Run Code Online (Sandbox Code Playgroud)
有人能给我一个提示,看哪个方向?
在现代时代,正如本杰明霍奇森所提到的,我们应该Applicative为这个特殊目的而使用:
myMapM :: Applicative f
=> (a -> f b) -> [a] -> f [b]
Run Code Online (Sandbox Code Playgroud)
我们想myMapM f []成为pure [](我们无法获得任何bs!),所以
myMapM f [] = pure []
Run Code Online (Sandbox Code Playgroud)
现在我们了解问题的核心,找出递归步骤.我们想要myMapM f (x : xs)执行f x,执行myMapM f xs和组合结果.所以
myMapM f [] = pure []
myMapM f (x : xs) = (:) <$> f x <*> myMapM f xs
Run Code Online (Sandbox Code Playgroud)
使用列表做一些不错的常规操作时,我们常常可以逃脱foldr:
myMapM f = foldr go (pure []) where
go x r = (:) <$> f x <*> r
Run Code Online (Sandbox Code Playgroud)