Nat*_*ell 20 haskell category-theory
看看Haskell文档,提升似乎基本上是一种泛化fmap
,允许使用多个参数映射函数.
关于提升的维基百科文章给出了不同的观点,然而,根据类别中的态射来定义"提升",以及它如何与类别中的其他对象和态射相关(我不会在此提供详细信息).我想如果我们考虑Cat(类别的类别,从而使我们的态射函数),那可能与Haskell情况有关,但我无法看到这个类别理论的概念如何与Haskell中的那个相关联根据链接的文章,如果它完全.
如果这两个概念没有真正相关,并且只是有一个相似的名称,那么Haskell中使用的升力(类别理论)是什么?
Eva*_*ins 22
提升和扩展的双重概念在Haskell中绝对使用,也许最突出的是以comonadic extend
和monadic为幌子bind
.(令人困惑的是,extend
一个电梯,不是一个扩展).一个comonad w
的extend
让我们接受一个函数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 b
和return :: 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
荷兰国际集团fst
和snd
中,我们得到一个函数f (a, b) -> f a
和f (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
实际上给了我们沿垂直箭头的水平箭头的扩展.