【发布时间】:2019-07-17 23:02:29
【问题描述】:
在 Haskell 中,Functor 类声明为:
class Functor f where
fmap :: (a -> b) -> f a -> f b
类型变量a 和b 可以是函数类型,还是必须是非函数类型?
如果它们可以是函数类型,那么在使fmap 能够应用于具有任意数量参数的函数方面,Functor 类是否与Applicative 类实际上相同?根据 Hutton 的 Haskell 编程 所说:
仿函数抽象了
fmap将函数映射到结构的每个元素的想法。应用程序将这个想法概括为允许fmap映射具有任意数量参数的函数,而不是仅限于具有单个参数的函数。
在应用中:
fmap0 :: a -> f a fmap0 = pure fmap1 :: (a -> b) -> f a -> f b fmap1 g x = pure g <*> x fmap2 :: (a -> b -> c) -> f a -> f b -> f c fmap2 g x y = pure g <*> x <*> y fmap3 :: (a -> b -> c -> d) -> f a -> f b -> f c -> f d fmap3 g x y z = pure g <*> x <*> y <*> z
Applicative 类声明为:
class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b
谢谢。
【问题讨论】:
-
a和b可以是函数类型。 -
那么应用程序能做什么而函子不能呢?查看我的更新
-
您对
fmap1的实现使用Applicative方法。这表明仅仅拥有Applicative就足以实现Functor。但是您的问题是另一种方式:仅拥有Functor就足以实现Applicative吗?我认为,如果您尝试另辟蹊径——尝试写下pure和(<*>)的实现,只在右侧使用fmap(以及纯粹的东西)——你会发现自己很快就卡住了确实。 -
b可以是一个函数类型这一事实就是为什么Applicative存在:fmap (+) (Just 3) == Just (+3)。Applicative允许您将部分应用+的结果应用于另一个Just值。fmap (+) (Just 3) <*> Just 5 == Just (+3) <*> Just 5 == Just 8.
标签: haskell types functor applicative