gpt4 book ai didi

haskell - 将 `Functor` 类泛化为 `MultiFunctor`?

转载 作者:行者123 更新时间:2023-12-05 08:53:16 26 4
gpt4 key购买 nike

我正在从“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)是自然转变:

\mu_{x,y} : F(x) \otimes F(y) \to F(x \otimes y)

然后可以从这个 Multifunctor 得到一个应用程序概括。只需更改 pure对于 fmap0(<*>)对于 fmap2 ($) .

关于haskell - 将 `Functor` 类泛化为 `MultiFunctor`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com