Haskell 理解函数式编程中的排序

Haskell 理解函数式编程中的排序,haskell,functional-programming,category-theory,Haskell,Functional Programming,Category Theory,我基本上是个务实的人,但我觉得这很有趣 我一直在考虑单体测序,有几个 我需要澄清的事情。所以冒着听起来很傻的风险 它是: 一元成员绑定 bind::mb->(b->mc)->mc 可以对“操作”进行排序,以便显式访问中间值 这给了我比分类成员更多的东西是什么 (::cat b c->cat a b->cat a c 有了这个,我可以排序并访问中间值。 毕竟(f.g)x=f(g(x)) 如果我可以用(.)进行排序,为什么我需要绑定。每一个单子都会产生所谓的单子。对于每个monadm,其对应的Kle

我基本上是个务实的人,但我觉得这很有趣

我一直在考虑单体测序,有几个 我需要澄清的事情。所以冒着听起来很傻的风险 它是:

一元成员绑定

bind::mb->(b->mc)->mc

可以对“操作”进行排序,以便显式访问中间值

这给了我比分类成员更多的东西是什么

(::cat b c->cat a b->cat a c

有了这个,我可以排序并访问中间值。 毕竟
(f.g)x=f(g(x))


如果我可以用
(.)进行排序,为什么我需要
绑定
。每一个单子都会产生所谓的单子。对于每个monad
m
,其对应的Kleisli类别都有箭头
a->mb
,它们可以使用组合,定义为

f >=> g     = \x -> f x >>= g
类型将其封装在Haskell类型系统中,您可以看到它有一个实例

instance Monad m => Category (Kleisli m) where
    id = Kleisli return
    (Kleisli f) . (Kleisli g) = Kleisli (g >=> f)
因此,该类别中的排序计算只是使用
=>
对操作进行排序,可以使用
>=
等价地表示

我们使用
return
>=
来定义monad,因为这样更方便,但是如果需要,我们也可以使用
return
=>
来定义monad


(另请参见。)

单子版的
()
(>=>)::单子m=>(a->MB)->(b->MC)->(a->MC)
,Kleisli构图。这实际上给了你更少的空间
C(a,b)=a->mb
构成一个范畴,以
bind
作为成分,以
return
作为身份,即
m
的Kleisli范畴。在
f(gx)
中,必须首先发生
gx
也是不太正确的。这只有在严格的语义下才是正确的。但是,就目前的情况而言,它可能是以前的,而不是现在。很酷,我想我开始学习如何更好地阅读类型给出的提示。我需要读本杰明·C·皮尔斯的《CS基础CT》一书。我一直在打字,但你比我快,所以我要补充的是,单子定律等同于使
Kleisli m
成为一个类别的定律:对身份的左右吸收,以及构图的联想。还要注意的是,
ArrowApply
定义了一个额外的结构,
Arrow
必须具有该结构才能生成monad
Kleisli m
不仅仅是一个类别,而是一个
箭头
,当然拥有额外的
箭头Apply
结构,但并非所有
箭头
都有。@pigworker:法律不是100%等价的,因为你需要添加一个额外的
(g>=>h)。f=(f.g)>=>h
定律,以便从
=>
定律中推断
=
定律。我不记得这叫什么,但我在做一些练习时被它抓住了。