- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从“Free Applicative Functors”中学习。当然,我要问的问题有点偏离论文的主要思想,但仍然...
...在第 6 页上,尝试将 Functor
泛化为 MultiFunctor
:
class Functor f ⇒ MultiFunctor f where
fmap0 :: a → f a
fmap1 :: (a → b) → f a → f b
fmap1 = fmap
fmap2 :: (a → b → c) → f a → f b → f c
...
从范畴论的角度来看,我看不出这个定义如何合理:fmap2
似乎只是一个双仿函数,即定义在 product category 上的仿函数。 .根据定义,产品类别由所有可能的有序对象对给出,态射也是对,因此: fmap2::(a -> a', b -> b') -> (fa, f b) -> (f a', f b')
看起来和感觉起来更合适。
我可以理解站在 (a -> b -> c) -> f a -> f b -> f c
选择后面的思考方式:这只是采取已知的最明显的方式(a -> b) -> f a -> f b
签名并强制它使用二进制函数,而不是一元函数。但是 MultiFunctor
(由上面的定义给出)实际上是范畴论所期望的意义上的双/多仿函数吗?
附言我很好奇的原因是,虽然论文指出可以.
最佳答案
我认为您所采用的范畴论角度是错误的。有一个 Bifunctor 类(带有 (a -> b) -> (c -> d) -> f a c -> f b d
类型的映射),但这不是这个概括。如果对某些函数进行取消柯里化(Currying),那么 fmap2
的签名看起来像:
fmap2 :: ((a,b) -> c) -> (f a, f b) -> f c
考虑到 fmap2 id
,我们看到我们正在实现的不是双仿函数而是笛卡尔仿函数(即笛卡尔类别之间的幺半群仿函数),其中 fmap2 id :: (f a, f b) -> f (a,b)
是自然转变:
然后可以从这个 Multifunctor
得到一个应用程序概括。只需更改 pure
对于 fmap0
和 (<*>)
对于 fmap2 ($)
.
关于haskell - 将 `Functor` 类泛化为 `MultiFunctor`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167529/
我是一名优秀的程序员,十分优秀!