函子是类别之间保留结构的转换。这是一种将对象从一个类别映射到另一类别的对象,同时还保留对象之间的箭头的一种方法-将其视为类别同构。
Endofunctor是从一个类别回到同一类别的函子。


在JavaScript中,通常可以将Array.map链接起来,因为它总是返回Array。

someArray
.map(f1)
.map(f2)
.map(f3)
...


因此,在第一次考虑(2)时,我只是认为“好,因为Array是具有方法映射的特殊类型,并且它返回相同的类型,因此JavaScript数组必须是endofunctor。”

但是,考虑到(1),我认为“等等,这仅仅是所有函子的结构节省功能,而不仅限于endofunctor吗?”

换句话说,可以安全地说“如果它是可链接的,那是一个终结者”?还是无效的,因为可链接的图和内在是另一个概念?

最佳答案

是的,Array.map在javascript中是endofunctor,因为它通过使用object作为self返回object。注意,仅在JS中,因为它仅使用object

在C#等其他语言中,定义数组时,需要提供包含类型,它们之间的映射将成为函子,而不是endofunctor。

很容易识别。当且仅当类的函子总是返回与其自身相同的类时,此函子才是endofunctor。

因此,在MyClass类中,

a: function(){
   return this;
},
b: function(){
   return new MyClass();
}


那些是终结者。

但是,说可链接的函子是endofunctor是不安全的。

只需想象两个类class MyClassA()class MyClassB()都具有一个共享相同名称的函子(这很常见)。

MyClassA中,

changetype: function(){
   return MyClassB;
}


反之亦然。

因此,一旦您可以编写类似

a = new MyClassA();
a.changetype().changetype().changetype()......


并没有麻烦。

因此,如果您找到一个可链接的函子,就无法确定它是否为endofunctor。因为共享同名函子在所有编程语言中都是非常典型的。

关于javascript - JavaScript Array.map通常是endofunctor还是仅仅是functor?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51219319/

10-09 18:31