在Haskell中,映射函数是函子吗?

在Haskell中,映射函数是函子吗?,haskell,category-theory,Haskell,Category Theory,地图类型为:(a->b)->[a]->[b] 而函子fmap的类型为: 函子f=>(a+b)->f a->f b 我在维基百科上读到,地图是一种多态性变体,而fmap是一种多型变体,但这并没有让我真正明白 所以我的问题是:map函数是一个函子吗?不是,但是任何实现fmap的容器都是一个函子。列表也实现了fmap(试试看!),所以列表就是函子。Map只是列表的fmap的实现。不,但是任何实现fmap的容器都是一个函子。列表也实现了fmap(试试看!),所以列表就是函子。Map只是列表的fmap的实

地图类型为:(a->b)->[a]->[b]

而函子fmap的类型为:

函子f=>(a+b)->f a->f b 我在维基百科上读到,地图是一种多态性变体,而fmap是一种多型变体,但这并没有让我真正明白


所以我的问题是:map函数是一个函子吗?

不是,但是任何实现fmap的容器都是一个函子。列表也实现了fmap(试试看!),所以列表就是函子。Map只是列表的fmap的实现。

不,但是任何实现fmap的容器都是一个函子。列表也实现了fmap(试试看!),所以列表就是函子。Map只是列表的fmap的实现。

用Haskell的术语来说,
fmap
是typeclass
Functor
中的一个方法,而不是Functor本身<代码>[],
可能
。。。是实例化类
Functor
的类型构造函数,滥用该语言,可以说“Maybe is a Functor”


在数学术语中,函子(或者更具体地说,在本例中,是Hask类别中的内函子,Haskell类型的类别)由两个映射组成:第一个映射从一个类型到另一个类型,第二个映射从一个箭头(
a->b
)到另一个(
fa->fb
)保持结构。从这个意义上说,
Maybe
是将一个类型映射到另一个类型的第一个箭头,比如说
Int
Maybe Int
,而
fmap
Maybe
是第二个箭头。

用哈斯克尔的话说,
fmap
是typeclass
Functor
中的一个方法,而不是Functor本身<代码>[],
可能
。。。是实例化类
Functor
的类型构造函数,滥用该语言,可以说“Maybe is a Functor”

在数学术语中,函子(或者更具体地说,在本例中,是Hask类别中的内函子,Haskell类型的类别)由两个映射组成:第一个映射从一个类型到另一个类型,第二个映射从一个箭头(
a->b
)到另一个(
fa->fb
)保持结构。从这个意义上说,
Maybe
是将一个类型映射到另一个类型的第一个箭头,比如说
Int
Maybe Int
,而
Maybe
fmap
是第二个箭头。

与所有
(>)r
类型
映射
也是一个函子

(>)r
实际上只是一个简单的函数类型,如
r->a
,所有函数都是函子。与其他函子一样,您可能认为函数类似于容器,但在应用值时会得到包含的值。然而,对于函子实例,我们不能有一个带有两个类型变量的类型。这就是我们部分应用它的原因。就像
一样,a b
也是这样做的。由于我们对函数的返回值感兴趣,函数类型的函子实例是部分应用的
r->a
,即
(>)r

让我们看一个函数函子实例

instance Functor ((->) r) where  
  fmap f g = (\x -> f (g x))
回到问题上来,
map
是一个类型为
(a->b)->[a]->[b]
的函数,我们可以像
(a->b)->([a]->[b])
那样重写它,所以这里
r
变量在函子实例中代表
a->[b
,而
a
变量在函子实例中代表
[a]->[b]
。因此,让我们在
map
上应用
fmap
,就像
fmap($)map
一样。这基本上意味着它将返回一个函数,如
\x->($)map x
。其中
x
必须是
(a->b)
类型函数。所以让我们使用
;下例中
fmap
的中缀表示

Prelude> (($) <$> map) (+2) [1,2,3]
[3,4,5]
Prelude>($)地图(+2)[1,2,3]
[3,4,5]
所以。。是的
map
是一个函子。

像所有
(>)r
类型
map
也是一个函子

(>)r
实际上只是一个简单的函数类型,如
r->a
,所有函数都是函子。与其他函子一样,您可能认为函数类似于容器,但在应用值时会得到包含的值。然而,对于函子实例,我们不能有一个带有两个类型变量的类型。这就是我们部分应用它的原因。就像
一样,a b
也是这样做的。由于我们对函数的返回值感兴趣,函数类型的函子实例是部分应用的
r->a
,即
(>)r

让我们看一个函数函子实例

instance Functor ((->) r) where  
  fmap f g = (\x -> f (g x))
回到问题上来,
map
是一个类型为
(a->b)->[a]->[b]
的函数,我们可以像
(a->b)->([a]->[b])
那样重写它,所以这里
r
变量在函子实例中代表
a->[b
,而
a
变量在函子实例中代表
[a]->[b]
。因此,让我们在
map
上应用
fmap
,就像
fmap($)map
一样。这基本上意味着它将返回一个函数,如
\x->($)map x
。其中
x
必须是
(a->b)
类型函数。所以让我们使用
;下例中
fmap
的中缀表示

Prelude> (($) <$> map) (+2) [1,2,3]
[3,4,5]
Prelude>($)地图(+2)[1,2,3]
[3,4,5]

所以。。是
map
是一个函子。

更正确的答案是“任何合法实现fmap的类型都是函子”。由于
Functor
并不总是像容器一样(例如
contr
),而且并非
fmap
的每个实现都是有效的
Functor
。除了@cdk所说的之外,这个答案开头的“否”有点误导,因为所有函数类型都是funcor,
map
都是函数(因此
map
函子的关系基本上与列表
['a','b','c']
的关系相同)。更正确的答案是“任意类型”