升降机和扩展的双重概念在 Haskell 中绝对使用,也许最突出的是 comonadicextend
和monadic bind
。(令人困惑的是,extend
是电梯,而不是扩展。)comonadw
让extend
我们获取一个函数w a -> b
并将其提升extract :: w b -> b
以获取地图w a -> w b
。在 ASCII 艺术中,给定图表
w b
|
V
w a ---> b
其中垂直箭头是提取的,extend
给我们一个对角箭头(使图表通勤):
-> w b
/ |
/ V
w a ---> b
大多数Haskellers 更熟悉的是monad的bind
( ) 的双重概念。给定一个函数and ,我们可以“扩展”我们的函数以获得一个函数。在 ASCII 艺术中:>>=
m
a -> m b
return :: a -> m a
return
m a -> m b
a ---> m b
|
V
m a
给我们
a ---> m b
| __A
V /
m a
(那A
是一个箭头!)
所以是的, extend
could have been called lift
, 并且bind
could have been called extend
。至于Haskell's lift
,我不知道他们为什么这么叫!
编辑:实际上,我再次认为,Haskell 的lift
s 实际上是扩展。如果f
是可应用的,并且我们有一个函数a -> b -> c
,我们可以将这个函数组合pure :: c -> f c
成一个函数a -> b -> f c
。Uncurrying,这与 function 相同(a, b) -> f c
。现在我们也可以通过 hit (a, b)
withpure
来获得一个函数(a, b) -> f (a, b)
。现在,通过fmap
ingfst
和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)
现在liftA2
给我们一个函数(f a, f b) -> f c
,我不会画它,因为我厌倦了制作糟糕的图表。但关键是,图表是通勤的,所以liftA2
实际上给了我们沿垂直箭头的水平箭头的延伸。