我是新手,我可能会遗漏一些重要的东西。我已经阅读了Category Theory for Programmers的第一部分,但我在大学里做的最抽象的数学是群论,所以我必须读得很慢。
我最终想要理解这个技术的理论,所以每当我觉得我已经取得了一些进展时,我会回到幻想世界的规范来测试自己。这次我觉得我知道从哪里开始:我从Functor开始。
函子
u.map(a => a)
相当于u
(身份)- 醇>
u.map(x => f(g(x)))
相当于u.map(g).map(f)
(作文)
map
方法map :: Functor f => f a ~> (a -> b) -> f b
具有Functor 的值必须提供map方法。 map方法有一个参数:
u.map(f)
f必须是一个函数,
我。如果f不是函数,则未指定map的行为。
ii.f可以返回任何值。
III。不应检查f的返回值的任何部分。
- 醇>
map必须返回相同Functor的值
我不理解短语" 有一个仿函数的值"。
对于"有一个仿函数"的价值意味着什么?我不认为"是一个算符"或者"属于仿函数"在这里会更有意义。
有关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
类型的值。
答案 0 :(得分:1)
正如你所说,编程中的函子是类型之间的映射,但JavaScript没有类型,所以你必须想象它们。在这里,假设函数f
从类型a
转到类型b
。值u
是某个仿函数F
作用于a
的结果。 u.map(f)
的结果属于F b
类型,因此您可以使用F a
(u
的类型)到F b
的映射。在此,map
被视为u
的方法。
尽可能接近JavaScript中的仿函数。 (同样的字母f
可替代地用于文档中的函数和函子,这无助于帮助。)