【发布时间】:2020-08-20 23:48:52
【问题描述】:
在范畴论中,Functor的概念如下:
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 的著名文章。
Functors, Applicatives, And Monads In Pictures
这里,
足够简单。让我们通过说任何值都可以在上下文中来扩展它。现在你可以把上下文想象成一个盒子,你可以在里面放一个值:
或
以下是我们编写 fmap (+3)(仅 2)时幕后发生的事情:
我一直对Functor 的感觉是范畴论中的 Functor 概念和 wrap&unwrap to/from "BOX" 的概念不太匹配。 p>
问题点 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。
为什么范畴论中的 Functor 概念和 wrap&unwrap to/from "BOX" 的概念不匹配?
编辑:
即使对于IO 函子,在合成过程中,f 也被解包:
// f is unwrapped in composition process
const compose = g => f => x => g(f(x));
const fmap = compose;
const print = a => () => console.log(a);
// safely no side-effect
const todo = fmap(print("bar"))(print("foo"));
//side effect
todo(undefined); // foo bar
// with pipleline operator (ES.next)
//
// const todo = print("foo")
// |> fmap(print("bar"))
// |> fmap(print("baz"));
// todo(undefined); // foo bar baz
【问题讨论】:
-
欢迎来到 Stack Overflow。我们喜欢每个帖子一个问题,它可以帮助未来的学习者找到他们正在寻找的东西。
-
谢谢,我明白了,但是有些问题可以分为多个点,我认为不应该为以后的学习者单独提出。这是一个问题。
-
@MichaelLitchard 并且在您阅读我对您个人意见的不同意见后,请不要投反对票。我相信我所做的和所说的都没有错。公平地说,只有我的错误是写了问题2,然后让你这样评论。我修改为问题点。
-
@smooth_write 你假设知道谁对你投了反对票以及为什么。这看起来很糟糕。
标签: haskell functor category-theory category-abstractions