Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript Array.map通常是一个内函子还是仅仅是一个函子?_Javascript_Functor_Map Function - Fatal编程技术网

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

函子是类别之间保持结构的变换。这是一种将对象从一个类别映射到另一个类别的对象,同时保留对象之间的箭头的方法,可以将其视为类别同态

  • 内函子是从一个类别返回到同一类别的函子

  • 在JavaScript中,Array.map通常可以链接,因为它总是返回数组

    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
    。它只是数组或对象。因此,我认为你的回答是不正确的。谢谢