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

时间:2012-02-28 18:40:09

标签: haskell data-structures types terminology

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

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

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

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

此数据结构是否有通用名称?

3 个答案:

答案 0 :(得分:23)

这是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以及这两篇博文:12),并且有一般应用程序流处理(如迭代)。

它在很多方面类似于协程,但它是一个更具体的概念。我链接的两个博客文章称它们为协同程序,因此“coroutine”肯定是引用它的常用方法,但精确的名称是自动机箭头。

答案 1 :(得分:8)

我将该数据结构称为Coroutine。

它表示可以与其他计算并行控制的计算,并且可以逐步评估。虽然你提供的接口不是用于Haskell中的Coroutines类的确切接口(更通用的Coroutine也是monad-anostic,意味着包装函数返回m (R a b, b),而协同程序没有要消耗输入,而你在这里总是要用a来提供计算,它就足够了。

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

答案 2 :(得分:3)

该类型看起来与我期望用于传感器的类型有关 - 我只希望输出类型是单向的。维基百科有一个关于特定类别传感器的页面finite state transducers,它应该是文献检索的一个很好的起点。