类型模式名称: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))的主要内容,如果未能解决你的问题,请参考以下文章