首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将状态单模与同状态comonad相结合

将状态单模与同状态comonad相结合
EN

Stack Overflow用户
提问于 2014-06-26 20:46:09
回答 2查看 708关注 0票数 5

如何将状态单S -> (A, S)与共态(E->A, E)相结合

我尝试了两个明显的组合S -> ((E->A, E), S)(E->S->(A, S), E),但在这两种情况下,我不知道如何定义操作(returnextract,.(等等)用于组合。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-04 00:10:41

如果将两个单子OI结合在一起,那么OI就会产生一个单模,即有一个extract方法。每一个共餐都是相互联系的。如果O和I‘都是相互关联的,那么您就有两种不同的“自然”方法来获得一个monad,这些方法大概是不等价的。

你有:

代码语言:javascript
复制
unit_O :: a -> O a
join_O :: O (O a) -> O a
unit_I :: a -> I a
join_I :: I (I a) -> I a

在这里,为了清晰起见,我添加了_O_I;在实际的Haskell代码中,它们不会出现在那里,因为类型检查器会自己显示出来。

您的目标是显示O (I O (I a)))是一个单曲。让我们假设O是复制的,即有一个函数extract_O :: O a -> a

然后我们有:

代码语言:javascript
复制
unit :: a -> O (I a)
unit = unit_O . unit_I
join :: O (I (O (I a))) -> O (I a)

当然,问题在于实现join。我们遵循这一战略:

  • fmap在外部O
  • 使用extract_O获得内部O的骑行
  • 使用join_I将两个I monads组合起来

这让我们发现

代码语言:javascript
复制
join = fmap_O $ join_I . fmap_I extract

要使此工作,您还需要定义

代码语言:javascript
复制
newtype MCompose O I a = MCompose O (I a)

并将各自的类型构造函数和解构函数添加到上述定义中。

另一种选择是使用extract_I而不是extract_O。这个版本甚至更简单:

代码语言:javascript
复制
join = join_O . fmap_O extract_I

这就定义了一个新的单曲。我想您可以用同样的方式定义一个新的comonad,但我还没有尝试过。

票数 3
EN

Stack Overflow用户

发布于 2017-01-02 14:56:00

正如另一个答案所示,S -> ((E->A, E), S)(E->S->(A, S), E)的两个组合同时具有Monad和Comonad实例。实际上,给出一个Monad/Comonad实例就相当于给出一个单半群结构。它的点∀r.r->f(r)或它的辅助点∀R.F(R)∀,至少在经典的、非建设性的意义上(我不知道建设性的答案)。这个事实表明,一个函子f很有可能同时是Monad和Comonad,只要它的点和点不是平凡的。

然而,真正的问题是,作为这样构造的Monad/Comonad实例是否具有自然的计算/分类意义。在这种情况下,我会说“不”,因为你似乎对如何以一种适合你的计算需要的方式组合它们没有先验的知识。

组成两个(Co)单子的标准分类方法是通过附加词。让我总结一下你的情况:

代码语言:javascript
复制
      Fₑ         Fₛ
      -->       -->
Hask  ⊣   Hask  ⊣ Hask
      <--       <--
      Gₑ         Gₛ

Fₜ(a) = (a,t)
Gₜ(a) = (t->a)

Fₜ⊣Gₜ的证明:

代码语言:javascript
复制
Fₜ(x) -> y   ≃
(x,t) -> y   ≃
x  -> (t->y) ≃
x  -> Gₜ(y)

现在您可以看到,状态单(s->(a,s))≃(s->a,s->s)是组成GₛFₛ,而同态共模是FₑGₑ。这个附加项说,Hask可以解释为(Co)态(Co)代数的一个模型。

现在,“附加词合成。”例如,

代码语言:javascript
复制
FₛFₑ(x) -> y ≃
Fₑ(x)   -> Gₛ(y) ≃
x       -> GₑGₛ(y)

FₛFₑ⊣GₑGₛ.这给出了一对单模和一个comonad,即

代码语言:javascript
复制
T(a) = GₑGₛFₛFₑ(a)
     = GₑGₛFₛ(a,e)
     = GₑGₛ(a,e,s)
     = Gₑ(s->(a,e,s))
     = e->s->(a,e,s)
     = ((e,s)->a, (e,s)->(e,s))

G(a) = FₛFₑGₑGₛ(a)
     = FₛFₑGₑ(s->a)
     = FₛFₑ(e->s->a)
     = Fₛ(e->s->a,e)
     = (e->s->a,e,s)
     = ((e,s)->a, (e,s))

T仅仅是状态为(e,s)的状态,G是同态与同态(e,s)的共态,所以这些都具有非常自然的意义。

作词是一种自然、频繁的数学运算。例如,topoi (某种笛卡儿闭范畴,在“类型层次”上允许复杂(非自由)结构)之间的几何态射被定义为一对附加关系,只要求它的左伴随精确(即保留有限的极限)。如果这些topoi是拓扑空间上的滑轮,那么组合这些附加词就相当于构成(唯一)连续的基变化映射(相反的方向),具有非常自然的意义。

另一方面,直接写单数/共形似乎是数学中一种非常罕见的做法。这是因为通常(Co)元被认为是代数理论的载体,而不是模型。在这种解释中,相应的附加词是模型,而不是单句。问题是,写两种理论需要另一种理论,一种关于如何构成它们的理论。例如,想象一下构成两个一元论。然后你可能会得到至少两个新的理论,即列表理论,或者两种二元运算分布的类环代数。两者都不是天生的更好/更自然的。这就是“单曲不作曲”的意思,它没有说作文不能是单曲,而是说你需要另一个理论来创作它们。

相反,合成附加词自然会产生另一个附加关系,因为这样做就意味着指定了两个给定理论的合成规则。因此,通过采用组合附加项的单数,你就得到了同样指定合成规则的理论。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24439917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档