smo*_*ing 2 javascript haskell functor category-theory
编程中有没有通用的函子(不限于自函子)用法?
我理解使用内函子的原因是使结构变得简单,如 monoid 或 monad。
我也最终明白,所有的值都归结为一种编程语言的类别(例如 Hask),但我在这里谈论的是同一类别的字符串、数字、布尔值或函数之间的内函子。
相关问题:
首先,是的。
例如,我们都知道幺半群可以定义为具有
(<>)在 Haskell 中)mempty在 Haskell 中)。在这个意义上,两个幺半群之间的同态成为两个范畴之间的函子。
现在,比如说, typeA和B都是幺半群;它们之间的函子只是一个同态函数f :: A -> B,将每个映射A到B,保留组合。
但是,等等,
f :: A -> B甚至不是Functor(请注意,我在这里使用等宽字体)!
不,它不是FunctorHaskell 中的 a,但它仍然是数学意义上的函子。
所以,为了强调,我再次声明:在编程中使用“非内”函子,并且可能比内函子更频繁。
这里的重点是范畴论是一种高度抽象的理论——它提供了抽象具体对象的概念。我们可以将这些概念定义为在不同的上下文中表示不同的事物。
和Hask(或设置,或子类别设置)只是一个这些无穷的定义,这使得
(.)id函数。将这个“分类宇宙”定义与上面的“分类幺半群”定义进行比较 - 恭喜,您现在已经知道了两种不同的分类方式!
总而言之,请记住,范畴论本身只是一些抽象。抽象本身没有意义,也没有任何用处。我们将它们与真实的事物联系起来,只有这样它们才能给我们带来便利。通过具体的例子理解抽象概念,但永远不要将这些概念本身简化为任何具体的东西(例如,永远不要将函子简化为某个“分类世界”(例如Hask、Set等)中的函子!)。
PS如果你问“ Haskell中是否有一个函子将Hask发送到另一个类别?” 那么答案可以是yes 或 no。例如,可以定义一个类别Hask * Hask包含任何两种类型的笛卡尔积,和一个算符
data Diag a = Diag a a,fmap f x = Diag (f x) (f x)发送每种类型A以它的平方A * A。然而,Hask * Hask仍然是一个子类别Hask,所以我们可以说这是一个endofunctor了。