JavaScript Array.map通常是endofunctor还是仅仅是functor?

时间:2018-07-07 01:58:26

标签: javascript functor map-function

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

  2. Endofunctor是从一个类别返回到同一类别的函子。

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

if loginsignup == "L":  # Here is where it is.

userpassR = open("USERPASS.txt.txt", "r")
line1 = userpassR.readline()      # It's only one line
line2 = userpassR.readline()      # It's another line

username = input("Username: ")
password = input("Password: ")

if username == line1[:-1]:         # I removed the '\n' at the end of line1
    print("Username Right.")

if password == line2:              # There isn't a '\n' here
    print("Password Right.")

userpassR.close()

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

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

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

2 个答案:

答案 0 :(得分:1)

是的,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。因为共享同名函子在所有编程语言中都是非常典型的。

答案 1 :(得分:0)

这是一个函子(或多或少),而不是内函。

首先要意识到的是,数学中的函子与编程中的函子不同,就像数学集理论中的类与编程中的类不同。在编程中-特别是在Haskell中-Functor是接口的名称。是的,一个界面。因为在Haskell中,类型类定义了一个接口,而Functor是一个类型类的名称,该类需要类型实现一个名为“ fmap”的函数才能满足Functor接口。

此处有更多详细信息:https://motts42.blogspot.com/2017/12/functors-according-to-haskell.html

Functor类型类看起来像fmap :: (a -> b) -> f a -> f b。名称“ f”,“ a”和“ b”都是变量 types 。因此,例如,fmap可能会将Box Int转换为Box String,或将List String转换为List Bool。容器类型(例如Box或List)将始终相同,如fmap的签名中由类型变量“ f”所表示。唯一可以更改的部分是容器包含的类型。

Haskell没有定义一个叫做endofunctor的东西,所以现在我们不得不推测一下。毕竟,请记住,Haskell函子是类型的接口,而不是类别之间的转换。在数学中,endofunctor是一个将类别映射到自身的函子。在Haskell的Functor上下文中,我能解释的最好方法是fmap的类型变量“ a”和“ b”是同一类型的函子。也就是说,fmap函数将Box Int映射到另一个Box Int,或者将List String映射到另一个List String

当然,对于JavaScript数组,您可以将一个数字数组映射到另一个数字数组,但绝不限于此。您可以自由地将任何东西的数组映射到几乎所有其他东西的数组。