Haskell类似函数(可能)
我必须实现一个函数Haskell类似函数(可能),haskell,Haskell,我必须实现一个函数maybemap 它有一个函数(类似于函数映射) f :: a -> b 它应该应用于列表类型可能是a,并给出一个列表可能是b maybemap :: (a -> b) -> [Maybe a] -> [Maybe b] 如何定义maybemap函数?您可以使用Maybe的functor实例,其定义如下: fmap :: (a -> b) -> Maybe a -> Maybe b -- fmap's type for Maybe
maybemap
它有一个函数(类似于函数映射)
f :: a -> b
它应该应用于列表类型可能是a
,并给出一个列表可能是b
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
如何定义
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)
使用此函数,可以如下定义函数:
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap f = map (fmap f)
最简单的解决方案,正如上面提到的
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
函数的函子,fmap
是具有相同签名的函数:fa->fb
。我们的功能只能由fmap
s组成:
fmap2 = fmap fmap fmap
简而言之,
maybemap=map。fmap
。或者事实上,maybemap=fmap-fmap-fmap
。。。嘿,我们以前没看过吗?谢谢!这个函数的意义是什么?我如何证明它是否有效?因为(r->)
也是一个组成为fmap
的函子,你可以写fmap2'=fmap-fmap-fmap
,它与fmap2
@kqr具有相同的签名,但我不能很容易地使用它,(fmap-fmap-fmap)(+“!”[没什么,只是“u”]
抛出一个错误。那么你一定是打错了(或者我遗漏的其他东西是错误的)因为你在评论中写的那行对我来说是正确的。@kqr我没有(函子((->)([Char]->[Char]))的实例。@viorior它对我有效,如果我问GHCifmap-fmap-fmap
的类型,我得到(函子f,函子f1)=>(a->b)->f(f1 a)->f(f1 b)
,这正是fmap2
的类型签名。