【发布时间】:2017-07-17 04:28:29
【问题描述】:
在Professor Frisby Introduces Composable Functional JavaScript中引入了恒等函子:
const Box = x =>
({
map: f => Box(f(x)),
fold: f => f(x) // for testing
})
我花了一天的大部分时间来理解函子以及为什么上面的 JavaScript 代码实际上是恒等函子。所以我想我会改变它以获得一个不是恒等函子的“真实”函子。我想出了这个:
const Endo = x =>
({
map: f => Endo(f(x).split('')),
fold: f => f(x).split('') // for testing
})
我的理由是 Box、Id_Box: Box -> Box 和 Id_Box f = f。 Endo 也会映射到自身,但 Endo(f): Endo(x) -> Endo(y)(如果 f: x -> y)。
我走对了吗?
编辑:
将 string 替换为更通用的 x,就像在原始示例中一样。
【问题讨论】:
-
预期结果是什么?你想达到什么目的?
-
我认为您的
Endo甚至不是有效的仿函数,因为它仅适用于从数组创建字符串的函数f。 Functor 需要处理任何类型的函数。 -
您在了解什么是函子的过程中遇到过其他函子吗?如果没有,我建议你继续讲课,听起来 Frisby 教授会在接下来的课程中介绍更多的函子。
-
在编程的上下文中,术语 endofunctor 只是描述了一个
(a -> b) -> (f a -> f b)类型的函子,它使用纯函数将类型映射到类型。所以任何具有给定类型的函子都是一个内函子,Identity只是最简单的一个。 Endofunctor 很有趣,因为它们的计算策略适用于任何类型,也就是说它们是多态的。因此,将您的Box函子限制为Strings 并不是特别有用。 -
@toraritte 用于编程目的,all functors are endofunctors。所以不,理解这种差异对你毫无帮助。函子是一种可以映射的数据结构,它尊重恒等函数和组合。就是这样。不要过于复杂。
标签: javascript functional-programming category-theory