函子是类别之间保留结构的转换。这是一种将对象从一个类别映射到另一类别的对象,同时又保留对象之间的箭头的一种方式-将其视为类别同构。
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吗?”
换句话说,可以安全地说“如果它是可链接的,那是一个终结者”?还是无效,因为可链接的图和内在是另一个概念?
答案 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数组,您可以将一个数字数组映射到另一个数字数组,但绝不限于此。您可以自由地将任何东西的数组映射到几乎所有其他东西的数组。