【发布时间】:2015-10-30 16:57:17
【问题描述】:
阅读this Wikibook about Haskell and Category Theory basics,我了解了Functors:
函子本质上是类别之间的转换,所以给定 类别 C 和 D,函子 F : C -> D
将 C 中的任何对象 A 映射到 D 中的 F(A)。
将 C 中的态射 f : A -> B 映射到 D 中的 F(f) : F(A) -> F(B)。
...听起来不错。稍后提供示例:
让我们也有一个示例实例:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap _ Nothing = Nothing
这是关键部分:类型构造函数 Maybe 将任何类型 T 转换为 新类型,Maybe T。此外,仅限于 Maybe 类型的 fmap 需要一个 函数 a -> b 到函数 Maybe a -> Maybe b。但就是这样!我们已经 定义了两个部分,将 Hask 中的对象转换为 另一个类别(Maybe 上定义的 Maybe 类型和函数) 类型),以及将 Hask 中的态射转换为 这个类别。所以 Maybe 是一个函子。
我了解fmap 的定义是关键。我对“类型构造函数 Maybe”如何提供第一部分感到困惑。我宁愿期待像pure 这样的东西。
如果我做对了,Maybe 宁可将C 映射到D。 (因此是类别级别的态射,这可能是 Functor 的要求)
我想你可以这样改写我的问题:是否有一个 Functor 没有明显的 pure 实现?
【问题讨论】:
-
感谢所有有用的答案。我选择了最详细的一个是“正确的”。
-
一个不承认
pure的简单Functor是data Void a。该实例看起来像instance Functor Void where { fmap f x = case x of {} }。 (我没有把这个作为答案,因为我认为这个例子并不是特别有启发性,即使它回答了你在正文中实际提出的唯一问题。) -
@DanielWagner 我认为这取决于不承认
pure的onlyFunctor的同构:如果你有any 值@ 987654335@ 在Functor中可以定义pure x = x <$ v。我认为pure的每个选择也是这种形式。当然,这通常不是很独特。 -
"将 Hask 中的对象带到另一个类别中的对象(Maybe 类型和在 Maybe 类型上定义的函数)" 我认为您混淆了 codomain 和图像。这里的codomain和domain一样,都是Hask,所以我们说的是endofunctor。 Maybe 下 Hask 的 image 是 codomain 的 subset -- 所有 Maybe 类型。你可以很容易地说服自己,Maybe 不会让你脱离 Hask,因为你可以多次应用 Maybe —— Maybe (Mabe a) 等等——内在的 Maybe 仍然在 Maybe 的领域。
-
@BartoszMilewski 你说得对,那是我的困惑。下面的答案已经澄清了这一点。我应该纠正我的问题吗(对我来说似乎没有必要)?
标签: haskell functor category-theory