为什么只有Applicative需要`pure`而没有Functor?

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而不是映射CD.(因此是类别级别的态射,这可能是Functor的要求)

我想你可以像这样重新解释我的问题:是否有一个没有明显实现的Functor pure

Aad*_*hah 14

我认为你在类型和价值观之间感到困惑.这是仿函数的定义:

CD类别.甲算符 ˚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→Yg:Y→Z.

类别由对象和对象之间的态射组成.

Haskell中的所有代码都是Haskell类的Hask的一部分.在哈斯克:

  1. 类型是对象.
  2. 函数是类型之间的态射.

因此,FunctorHaskell中的所有实例都是从Hask到Hask的函子(即它们是endofunctors).

更严格地说,对于FunctorHaskell中的所有实例:

  1. C = Hask.
  2. D = Hask.

现在,每个仿函数F是一个映射,它将每个对象X∈C与一个对象F(X)∈D相关联.

  1. 注意,XF(X)分别是CD的对象.
  2. 由于CD都是Hask,因此XF(X)都是类型而不是值.
  3. 因此,F:Type→Type或Haskell f : * -> *.

实际上,这正是FunctorHaskell中定义类型类的方式:

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)的实例的映射(即它是从值到值的函数).但是,我们需要从XF(X)的映射(即从类型到类型的映射).