Haskell类似函数(可能)

has*_*oob -2 haskell

我必须实现一个功能 maybemap

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

f :: a -> b
Run Code Online (Sandbox Code Playgroud)

它应该应用于列表类型Maybe a并给出一个列表Maybe b

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
Run Code Online (Sandbox Code Playgroud)

我该如何定义这个maybemap功能?

fjh*_*fjh 5

您可以使用Maybe的functor实例,其定义如下:

fmap :: (a -> b) -> Maybe a -> Maybe b -- fmap's type for Maybe
fmap f Nothing  = Nothing
fmap f (Just a) = Just (f a)
Run Code Online (Sandbox Code Playgroud)

使用此功能,您的功能可以像这样定义:

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap f = map (fmap f)
Run Code Online (Sandbox Code Playgroud)


vio*_*ior 5

最简单的解决方案,就像它提到的那样,

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap = map . fmap
Run Code Online (Sandbox Code Playgroud)

但总的来说它更通用的功能:

maybemap :: Functor f => (a -> b) -> [f a]  -> [f b]
Run Code Online (Sandbox Code Playgroud)

如我们所见,list也是一个仿函数,所以我们可以重写

fmap2 :: (Functor f, Functor g) => (a -> b) -> g (f a)  -> g (f b)
fmap2 = fmap . fmap
Run Code Online (Sandbox Code Playgroud)

并测试:

> fmap2 (++"!") [Nothing,Just"u"]
[Nothing,Just "u!"]
Run Code Online (Sandbox Code Playgroud)

更新

最有趣的fmap2,(.)也是a -> b功能的Functor ,fmap是一个具有相同签名的函数:f a -> f b.我们的功能只能包括fmap:

fmap2 = fmap fmap fmap
Run Code Online (Sandbox Code Playgroud)