首页 > 解决方案 > 在类 Functor 的声明中,类型变量可以是函数类型吗?

问题描述

在 Haskell 中,类Functor被声明为:

class   Functor f   where
fmap    ::  (a  ->  b)  ->  f   a   ->  f   b

类型变量可以是函数类型,a还是b必须是非函数类型?

如果它们可以是函数类型,那么在能够应用于具有任意数量参数的函数方面,是不是实际上 classFunctor变得与 class 相同?根据Hutton在 Haskell 中的编程所说:Applicativefmap

函子抽象了 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

谢谢。

标签: haskelltypesfunctorapplicative

解决方案


可以类型变量ab函数类型

- 好,当然。

是不是班级Functor变得实际上与班级相同Applicative

不,绝对不是。如果您将函数类型插入a或签名中,您会得到类似bfmap东西

fmap :: ((x -> y) -> b) -> f (x -> y) -> f b

或者

fmap :: (a -> p -> q) -> f a -> f (p -> q)

但至关重要的是,fmap总是只取一个f _包装值并准确地吐出一个这样的值。Applicative同时允许你接受任意数量的包装值,只要你给它一个函数来处理包含的值。


推荐阅读