对于#34;有一个仿函数"是什么意思?

时间:2017-11-24 01:04:21

标签: category-theory fantasyland

我是新手,我可能会遗漏一些重要的东西。我已经阅读了Category Theory for Programmers的第一部分,但我在大学里做的最抽象的数学是群论,所以我必须读得很慢。

我最终想要理解这个技术的理论,所以每当我觉得我已经取得了一些进展时,我会回到幻想世界的规范来测试自己。这次我觉得我知道从哪里开始:我从Functor开始。

来自fantasy-land spec

  

函子

     
      
  1. u.map(a => a)相当于u(身份)
  2.   
  3. u.map(x => f(g(x)))相当于u.map(g).map(f)(作文)
  4.         

    map方法

    map :: Functor f => f a ~> (a -> b) -> f b 
    
         

    具有Functor 的值必须提供map方法。 map方法有一个参数:

    u.map(f) 
    
         
        
    1. f必须是一个函数,

           

      我。如果f不是函数,则未指定map的行为。

           

      ii.f可以返回任何值。

           

      III。不应检查f的返回值的任何部分。

    2.   
    3. map必须返回相同Functor的值

    4.   

我不理解短语" 有一个仿函数的值"。

对于"有一个仿函数"的价值意味着什么?我不认为"是一个算符"或者"属于仿函数"在这里会更有意义。

有关u

的文字说明了什么?

我的理解是,仿函数是类别之间的映射(或者在这种情况下是从类别到自身)。我们正在处理类型的类别,其中对象是类型,而态射是将类型转换为另一种类型的函数族,或者类型本身。

据我所知,仿函数将a映射到Functor a。它有某种构造函数,如

Functor :: a -> F a

和地图功能一样,

map :: Functor f => (a -> b) -> f a -> f b

a引用任何类型,函数族(a -> b)引用从任何特定类型a指向任何其他特定类型的所有态射b。因此,对于我来说,区分不管是否存在的价值并不是真正有意义的。#34;有一个仿函数"因为如果存在至少一个仿函数,则它存在"对于"每种类型......所以每个值都可以通过一个函数来映射,该函数属于由仿函数提升的两种类型之间的态射。我的意思是:请给我一个价值的例子,它没有一个仿函数"。

仿函数的映射;它不是F a类型,它不是F a类型的值。所以在文档中,价值u不是一个仿函数,我不认为它有一个"仿函数...它是F a类型的值。

1 个答案:

答案 0 :(得分:1)

正如你所说,编程中的函子是类型之间的映射,但JavaScript没有类型,所以你必须想象它们。在这里,假设函数f从类型a转到类型b。值u是某个仿函数F作用于a的结果。 u.map(f)的结果属于F b类型,因此您可以使用F au的类型)到F b的映射。在此,map被视为u的方法。

尽可能接近JavaScript中的仿函数。 (同样的字母f可替代地用于文档中的函数和函子,这无助于帮助。)