我必须实现一个函数maybemap
它具有(类似于功能图)功能
f :: a -> b
它应该应用于列表类型Maybe a
并提供列表Maybe b
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
我如何定义maybemap
函数?
答案 0 :(得分:5)
您可以使用Maybe
的仿函数实例,其定义如下:
fmap :: (a -> b) -> Maybe a -> Maybe b -- fmap's type for Maybe
fmap f Nothing = Nothing
fmap f (Just a) = Just (f a)
使用此功能,您的功能可以这样定义:
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap f = map (fmap f)
答案 1 :(得分:5)
最简单的解决方案,就像它提到的那样,
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap = map . fmap
但总的来说它是更通用的功能:
maybemap :: Functor f => (a -> b) -> [f a] -> [f b]
如我们所见,list也是一个仿函数,所以我们可以重写
fmap2 :: (Functor f, Functor g) => (a -> b) -> g (f a) -> g (f b)
fmap2 = fmap . fmap
并测试:
> fmap2 (++"!") [Nothing,Just"u"]
[Nothing,Just "u!"]
<强>已更新强>
fmap2
中最有趣的,(.)
也是a -> b
函数的Functor,而fmap
是具有相同签名的函数:f a -> f b
。我们的功能只能包含fmap
s:
fmap2 = fmap fmap fmap