提升(在函数式编程环境中)如何与类别理论相关?

Nat*_*ell 20 haskell category-theory

看看Haskell文档,提升似乎基本上是一种泛化fmap,允许使用多个参数映射函数.

关于提升的维基百科文章给出了不同的观点,然而,根据类别中的态射来定义"提升",以及它如何与类别中的其他对象和态射相关(我不会在此提供详细信息).我想如果我们考虑Cat(类别的类别,从而使我们的态射函数),那可能与Haskell情况有关,但我无法看到这个类别理论的概念如何与Haskell中的那个相关联根据链接的文章,如果它完全.

如果这两个概念没有真正相关,并且只是有一个相似的名称,那么Haskell中使用的升力(类别理论)是什么?

Eva*_*ins 22

提升和扩展的双重概念在Haskell中绝对使用,也许最突出的是以comonadic extend和monadic为幌子bind.(令人困惑的是,extend一个电梯,不是一个扩展).一个comonad wextend让我们接受一个函数w a -> b,并沿着抬起extract :: w b -> b来获得地图w a -> w b.在ASCII艺术中,给出了图表

        w b
         |
         V
w a ---> b
Run Code Online (Sandbox Code Playgroud)

提取垂直箭头的地方,extend给我们一个斜箭头(使图表通勤):

     -> w b
    /    |
   /     V
w a ---> b
Run Code Online (Sandbox Code Playgroud)

大多数Haskellers比较熟悉的是monad 的双重概念bind(>>=)m.给定一个函数a -> m breturn :: a -> m a,我们就可以沿着"扩展"我们的功能return来获得功能m a -> m b.在ASCII艺术中:

a ---> m b
|
V
m a
Run Code Online (Sandbox Code Playgroud)

给我们

a ---> m b
 |  __A
 V /
m a
Run Code Online (Sandbox Code Playgroud)

(那A是一个箭头!)

所以是的,extend本来可以被召唤lift,而且bind可以被召唤extend.至于Haskell的lift,我不知道为什么他们被称为那个!

编辑:实际上,我认为,Haskell的lift实际上是扩展.如果f是适用的,并且我们有一个函数a -> b -> c,我们可以组合这个函数pure :: c -> f c来获得一个函数a -> b -> f c.没问题,这与功能相同(a, b) -> f c.现在,我们还可以打(a, b)pure得到的功能(a, b) -> f (a, b).现在,fmap荷兰国际集团fstsnd中,我们得到一个函数f (a, b) -> f af (a, b) -> f b,我们可以结合起来,得到一个功能f (a, b) -> (f a, f b).与我们pure之前的组合给出(a, b) -> (f a, f b).唷!所以回顾一下,我们有ASCII艺术图

  (a, b) ---> f c
    |
    V
(f a, f b)
Run Code Online (Sandbox Code Playgroud)

现在liftA2给我们一个功能(f a, f b) -> f c,我不会画,因为我厌倦了制作可怕的图表.但关键是,图表通勤,所以liftA2实际上给了我们沿垂直箭头的水平箭头的扩展.