JavaScript Array.map通常是一个内函子还是仅仅是一个函子?
函子是类别之间保持结构的变换。这是一种将对象从一个类别映射到另一个类别的对象,同时保留对象之间的箭头的方法,可以将其视为类别同态JavaScript Array.map通常是一个内函子还是仅仅是一个函子?,javascript,functor,map-function,Javascript,Functor,Map Function,函子是类别之间保持结构的变换。这是一种将对象从一个类别映射到另一个类别的对象,同时保留对象之间的箭头的方法,可以将其视为类别同态 内函子是从一个类别返回到同一类别的函子 在JavaScript中,Array.map通常可以链接,因为它总是返回数组 someArray .map(f1) .map(f2) .map(f3) ... 所以,在第一次考虑(2)时,我只是想“好吧,因为数组是一种特殊类型,它有一个方法映射,并且它返回相同的类型,所以JavaScript数组必须是endofunctor
someArray
.map(f1)
.map(f2)
.map(f3)
...
所以,在第一次考虑(2)时,我只是想“好吧,因为数组是一种特殊类型,它有一个方法映射,并且它返回相同的类型,所以JavaScript数组必须是endofunctor。”
然而,考虑到(1),我想“等等,这只是所有函子的一个结构保存特性,而不仅仅限于内函子吗?”
换句话说,说“如果它是可链的,它就是内函子”安全吗?或者它是无效的,因为可链接映射和endo是另一个概念 是的,Array.map在javascript中是endofunctor,因为它使用object作为self返回object。请注意,仅在JS中使用,因为它只使用
对象
在其他语言(如C#)中,当您定义一个数组时,需要给出包含类型,它们之间的映射将成为函子,而不是内函子
这很容易识别。当且仅当类的函子总是返回与其自身相同的类时,此函子是内函子
因此,在类MyClass
中
a: function(){
return this;
},
b: function(){
return new MyClass();
}
这些是内函子
然而,说可链函子是内函子是不安全的
简单地想象两个类,classmyclassa()
和classmyclassb()
,它们都有一个同名的函子(这是常见的)
在MyClassA
中
changetype: function(){
return MyClassB;
}
反之亦然
所以,一旦你能写下这样的东西
a = new MyClassA();
a.changetype().changetype().changetype()......
而且没有麻烦
因此,如果你发现一个函子链是可启用的,你就无法确定它是否是一个内函子。因为在所有编程语言中,共享相同名称的函子是非常典型的。它是一个函子(或多或少),而不是内函子
首先要认识到的是,数学中的函子与编程中的函子不同,就像数学集合论中的一个类与编程中的一个类不同一样。在编程中——特别是在Haskell中——Functor是接口的名称。是的,一个接口。因为在Haskell中,typeclass定义了一个接口,Functor是typeclass的名称,它要求类型实现一个名为“fmap”的函数以满足Functor接口的要求
详情如下:
函子类型类如下所示,fmap::(a->b)->fa->fb
。名称“f”、“a”和“b”都是变量类型。因此,例如,fmap可以将框Int
转换为框字符串
,或将列表字符串
转换为列表Bool
。容器类型(如框或列表)将始终相同,如fmap签名中由类型变量“f”表示的。唯一可以更改的部分是容器包含的类型
Haskell没有定义一个叫做内函子的东西,所以现在我们要推测一下。毕竟,记住Haskell函子是类型的接口,而不是类别之间的转换。在数学中,内函子是将一个类别映射到自身的函子。在Haskell函子的上下文中,我能解释这一点的最好方法是一个函子,其中fmap的类型变量“a”和“b”是相同的类型。也就是说,一个fmap函数将一个Box Int
映射到另一个Box Int
,或者将一个列表字符串
映射到另一个列表字符串
当然,在JavaScript的数组中,您可以将一个数字数组映射到另一个数字数组,但这并不局限于此。您可以自由地将任何内容的数组映射到任何其他内容的数组。注意,所有可链接的内容都不一定返回与输入相同的类型。非常好的回答,比我想象的更详细。非常感谢你!我认为人们经常提到“数学中的A和编程中的A不一样”是非常误导的。我不喜欢它,包括维基百科说的A(数学)/A(编程)。编程是数学,尤其是Haskell或函数编程。话虽如此,JavaScript数组不是列表,而是元组。我们不会像Haskell列表那样将数组的类型指定为
Array Int
或Array Strings
。它只是数组或对象。因此,我认为你的回答是不正确的。谢谢