我尝试在 JavaScript 中实现一个 Functor。
Functor的定义图如下:
或在 nLab
https://ncatlab.org/nlab/show/functor
在这里,如您所见,F(f)表达式在类别图中看起来很典型。
我设法Array.map在 JavaScript 中实现为 Functor,如下所示:
const compose = f => g => x => g(f(x));
const f = a => a * 2;
const F = a => [a];
const A = 1;
const FA = F(A); //[1]
const Ff = compose(f)(F);
const FB = Ff([FA]);
console.log(FB); //[2]Run Code Online (Sandbox Code Playgroud)
F = a => [a]
当A = 1,
F(1) = [1]
不过,虽然我明白什么F(f)意思,
F(f) = [f]
至少在 …
编程中有没有通用的函子(不限于自函子)用法?
我理解使用内函子的原因是使结构变得简单,如 monoid 或 monad。
我也最终明白,所有的值都归结为一种编程语言的类别(例如 Hask),但我在这里谈论的是同一类别的字符串、数字、布尔值或函数之间的内函子。
相关问题:
根据 Haskell 维基,
https://en.wikibooks.org/wiki/Haskell/Category_theory#Category_laws
品类法则 品类需要遵循三个法则。首先,也是最简单的,态射的组合需要是结合的。
然而,
关系的组合是结合的。
https://en.wikipedia.org/wiki/Composition_of_relations#Properties
函数的组合总是关联的。
https://en.wikipedia.org/wiki/Function_composition#Properties
那么,在什么情况下,Haskell 社区(或 wiki 假设的人)认为态射的组合不是结合违反规则的?
谢谢。
在范畴论中,函子的概念如下:
https://ncatlab.org/nlab/show/functor
在 Haskell 中,Functor类型可以表示为:
fmap :: (a -> b) -> f a -> f b
https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Functor.html
我可以看到两者真的很好地对应。
然而,一旦我们真正尝试将这个 Functor 概念实现到代码中,似乎就不可能定义F或fmap像上图所示那样简单。
事实上,有一篇关于 Functor/Monad 的著名文章。
这里,
足够简单。让我们通过说任何值都可以在上下文中来扩展这一点。现在,您可以将上下文视为一个盒子,您可以在其中放置一个值:
或者
以下是我们编写 fmap (+3)(仅 2)时幕后发生的事情:
我一直觉得Functor是函子范畴论的概念,并从“盒子”,包装及解包到/的概念不匹配良好。
问题点 1。
fmap :: (a -> b) -> f a -> f b
https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Functor.html
在 Haskell 中,wrap&unwrap to/from "BOX" 的实际实现在哪里?
问题点2。
为什么函子范畴论的概念和包装及展开从“盒子” /的概念不匹配呢?
编辑:
即使对于IOfunctor,在组合过程中,f也是解包的: