我必须实现一个功能 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
功能?
您可以使用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)
最简单的解决方案,就像它提到的那样,
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)
归档时间: |
|
查看次数: |
360 次 |
最近记录: |