类型模式名称:R a b = Q (a -> (R a b,b))

Posted

技术标签:

【中文标题】类型模式名称:R a b = Q (a -> (R a b,b))【英文标题】:Name of type pattern: R a b = Q (a -> (R a b,b)) 【发布时间】:2012-03-18 06:26:24 【问题描述】:

我在这里寻找一些词汇。有许多具有通用名称的形状。例如L a = Empty | Cons a L一般称为“列表”,而T a = Leaf a | Node (T a) (T a)是“二叉树”,St s a :: St (s->(a,s))是State Monad的形式。

我想知道这样的形状是否有名字:

data  R a b = Q (a -> (R a b,b))

我在 Arrow 框架和状态机实现中看到了这种模式。递归函数让它感觉有点像 State Monad 或 Cont Monad。它也是除了(->)(>=>) 之外的唯一结构,我已经看到了Arrow 的定义实例。

这种数据结构有通用名称吗?

【问题讨论】:

你那里有一棵盆景树:)。更好的二叉树是T a = Branch (T a) (T a) | Leaf a @amindfy:你是对的。我已经修好了。谢谢。 @JohnF.Miller 你不想在T a 的某个地方存储一些a 吗? :D(对不起...我不得不...)(或者它可能是幻影类型!?:p) 【参考方案1】:

这是automaton arrow,也称为 Mealy 机器。您的具体示例仅使用 (->) 作为基础箭头;另一个常见的选择是 Kleisli m 用于某些 monad m(它只是将 a -> b 变成 a -> m b;例如,data R a b = Q (a -> MyMonad (b, R a b)))。

它通常用于functional reactive programming(特别是箭头 FRP - 参见,例如netwire 和这两篇博文:1、2),并适用于一般流处理(如 iteratees)。

它在很多方面类似于协程,但它是一个更具体的概念。我链接的两篇博文称它们为协程,所以“协程”当然是一种常见的称呼方式,但准确的名称是自动机箭头。

【讨论】:

这正是我一直在寻找的。感谢您提供非常完整的答案。【参考方案2】:

我会将该数据结构称为协程。

它表示可以与其他一些计算并行控制的计算,并且可以逐步评估。虽然您提供的接口不是用于 Haskell 中的 Coroutines 类的确切接口(更一般的 Coroutine 也是 monad-agnostic,这意味着包装的函数返回 m (R a b, b),并且 coroutines 不必消耗输入,虽然您在这里总是必须使用 a) 来提供计算,但它已经足够相似了。

该数据结构也代表了所谓的 Comonads 的一个子集。

【讨论】:

【参考方案3】:

该类型看起来与我希望用于换能器的类型相关——我只希望输出类型是单形的。***有一个关于特定类型转换器的页面,finite state transducers,这应该是一个很好的文献搜索起点。

【讨论】:

以上是关于类型模式名称:R a b = Q (a -> (R a b,b))的主要内容,如果未能解决你的问题,请参考以下文章

1017 A除以B

1017. A除以B (20)

A除以B (20)

1017 A除以B (20分)

1017 A除以B

PAT 1017 A除以B