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))
如果我可以用
(.)进行排序,为什么我需要绑定。每一个单子都会产生所谓的单子。对于每个monadm
,其对应的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
必须具有该结构才能生成monadKleisli m
不仅仅是一个类别,而是一个箭头
,当然拥有额外的箭头Apply
结构,但并非所有箭头
都有。@pigworker:法律不是100%等价的,因为你需要添加一个额外的(g>=>h)。f=(f.g)>=>h
定律,以便从=>
定律中推断=
定律。我不记得这叫什么,但我在做一些练习时被它抓住了。