Haskell类似函数(可能)

时间:2013-11-04 10:00:48

标签: haskell

我必须实现一个函数maybemap

它具有(类似于功能图)功能

f :: a -> b

它应该应用于列表类型Maybe a并提供列表Maybe b

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]

我如何定义maybemap函数?

2 个答案:

答案 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
相关问题