Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell类似函数(可能)_Haskell - Fatal编程技术网

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它对我有效,如果我问GHCi
fmap-fmap-fmap
的类型,我得到
(函子f,函子f1)=>(a->b)->f(f1 a)->f(f1 b)
,这正是
fmap2
的类型签名。