为什么`pure`只适用于Applicative而不是Functor?

阅读这本关于Haskell和Category Theory基础知识的Wikibook,我了解了Functors:

函子本质上是类别之间的转换,因此给定类别C和D,函子F:C - > D

将C中的任何对象A映射到F(A),D中。

映射态射f:在C中的A→B到F(f):在D中的F(A)→F(B)

......听起来很好。 稍后提供一个例子:

我们也有一个示例实例:

instance Functor Maybe where
  fmap f (Just x) = Just (f x)
  fmap _ Nothing  = Nothing

以下是关键部分:类型构造函数Maybe可以将任何类型的T传递给一个新类型Maybe T.另外,限制为fim的类型可以使用函数a - > b函数Maybe a - > Maybe b。 但就是这样! 我们定义了两个部分,一部分将Hask中的对象带到另一个类别中的对象(Maybe类型和Maybe函数上定义的类型和函数),另一部分将Hask中的态射作为这个类别中的态射。 所以也许是一个仿函数。

我理解fmap的定义是如何关键的。 我对“类型构造函数Maybe”如何提供第一部分感到困惑。 我宁可期待像pure东西。

如果我说得对, Maybe宁可将C映射到D (因此在类别层次上是一种态度主义,这可能是一个Functor的要求)

我想你可以像这样重新修改我的问题:是否有Functor没有明显的pure实现?


我认为你会在类型和值之间感到困惑。 这是一个仿函数的定义:

让C和D成为类别。 从C到D的函数 F是一个映射:

  • 与每个对象X∈C关联一个对象F(X)∈D。
  • (f):F(X)→F(Y)∈D,使得以下条件成立:

  • 对于每个对象X∈C,F(id:X→X)= id:F(X)→F(X)
  • F(g∘f)= F(g)∘F(f)对于所有态f:X→Y和g:Y→Z.
  • 一个类包含对象之间的对象和态射。

    Haskell中的所有代码都是Hask的一部分,Haskell类。 在Hask中:

  • 类型是对象。
  • 函数是类型之间的态射。
  • 因此,Haskell中的所有Functor实例都是从Hask到Hask的函数(即它们是endofunctors)。

    更严格地说,对于Haskell中Functor所有实例:

  • C = Hask
  • D = Hask
  • 现在,每个函数F是一个映射,它与每个对象X∈C关联一个对象F(X)∈D。

  • 请注意,X和F(X)分别是C和D的对象。
  • 由于C和D都是Hask,X和F(X)都是类型而不是值。
  • 因此,F:Type→Type或Haskell f : * -> *
  • 事实上,这正是Haskell中定义Functor类型的方式:

    class Functor (f : * -> *) where
        fmap :: (x -> y) -> (f x -> f y)
    

    在这里, fmapfmap函数的第二部分。 这是一个从值到值的函数。 然而, Functor本身是一个类型构造器(即从类型到类型的映射)。 这就是Maybe是一个函子, []是一个函子,但是Maybe Int[Int]不是函子。

    请注意, pure并不构成函子定义的第一部分,因为它是从X实例到F(X)实例的映射(即它是从值到值的函数)。 但是,我们需要从X到F(X)的映射(即从类型到类型的映射)。


    如果我说得对, Maybe宁可将C映射到D (因此在类别层次上是一种态度主义,这可能是一个Functor的要求)

    不是真的,因为CD有类别,而不是Haskell类型。 Functor (即类型类的一个实例,与通常的函子相对)是Hask类别(Haskell类型和函数的类别)到Hask本身的映射 ; 也就是说, CD在这种情况下都是Hask 。 Wikibook章节提到在Hask的Functors部分。 在您的示例中, Maybe类型构造函数通过将类型aHask中的一个对象)添加到Maybe a类型( Hask中的另一个对象)来提供映射的第一部分。

    我想你可以像这样重新修改我的问题:是否有Functor没有明显的pure实现?

    一个例子是Functor(,) afmap很容易写- f (x, y) -> (x, fy) -但pure(<*>)需要Monoid约束上a ,因为就没有处理多余的方式a否则值。 有关更多讨论和其他示例,请参阅非函数/函数/应用/ Monad的良好示例?


    我会说Applicative实例对于Either是一种延伸(我只需Bifunctor一个Bifunctor的实例就Bifunctor ,但是另一方面将它用作Monad是很方便的),并且会(IMHO)成为不适合的东西,如:

    data ABC a = A a | B a | C a
    

    A,B,C全部“同样好”。 由于没有明显的选择应该使用pure ,所以根本不应该提供它。 虽然fmap仍然非常好。

    链接地址: http://www.djcxy.com/p/43313.html

    上一篇: Why is `pure` only required for Applicative and not already for Functor?

    下一篇: Where do values fit in Category of Hask?