rub*_*oor 11 haskell functor category-theory
阅读这篇关于Haskell和类别理论基础知识的Wikibook,我学习了Functors:
仿函数本质上是类别之间的转换,因此给定类别C和D,仿函数F:C - > D.
将C中的任何对象A映射到D中的F(A).
映射态射f:A - > B在C到F(f):F(A) - > F(B)在D.
......听起来很不错.后来提供了一个例子:
我们也有一个示例实例:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap _ Nothing = Nothing
Run Code Online (Sandbox Code Playgroud)
这是关键部分:类型构造函数可能将任何类型T转换为新类型,也许T.此外,fmap仅限于Maybe类型需要函数a - > b函数可能a - >可能b.但就是这样!我们已经定义了两个部分,一部分将Hask中的对象转换为另一个类别中的对象(Maybe类型和函数在Maybe类型上定义),以及将Hask中的态射视为此类别中的态射的东西.所以也许是一个算子.
我理解定义fmap
是关键的.我很困惑"类型构造函数Maybe"如何提供第一部分.我宁愿期待类似的东西pure
.
如果我做对了,Maybe
而不是映射C
到D
.(因此是类别级别的态射,这可能是Functor的要求)
我想你可以像这样重新解释我的问题:是否有一个没有明显实现的Functor pure
?
Aad*_*hah 14
我认为你在类型和价值观之间感到困惑.这是仿函数的定义:
设C和D为类别.甲算符 ˚F从Ç至d是一个映射的是:
- 关联到每个对象X∈C对象F(X)∈D.
关联到每个态射f:X→Y∈C一个态射F(f):F(X)→F(Y)∈D使得以下条件成立:
- 每个对象的F(id:X→X)= id:F(X)→F(X)X∈C.
- F(g∘f)= F(g)∘F(f)对于所有态射f:X→Y和g:Y→Z.
类别由对象和对象之间的态射组成.
Haskell中的所有代码都是Haskell类的Hask的一部分.在哈斯克:
因此,Functor
Haskell中的所有实例都是从Hask到Hask的函子(即它们是endofunctors).
更严格地说,对于Functor
Haskell中的所有实例:
C = Hask
.D = Hask
.现在,每个仿函数F是一个映射,它将每个对象X∈C与一个对象F(X)∈D相关联.
f : * -> *
.实际上,这正是Functor
Haskell中定义类型类的方式:
class Functor (f : * -> *) where
fmap :: (x -> y) -> (f x -> f y)
Run Code Online (Sandbox Code Playgroud)
这里fmap
是仿函数的第二部分.它是从值到值的函数.但是,它Functor
本身是一个类型构造函数(即从类型到类型的映射).就是这个原因Maybe
是一个仿函数和[]
一个函子,但Maybe Int
并[Int]
没有仿函数.
注意,pure
它不构成仿函数定义的第一部分,因为它是从X的实例到F(X)的实例的映射(即它是从值到值的函数).但是,我们需要从X到F(X)的映射(即从类型到类型的映射).