我在这里寻找一些词汇。有许多形状具有通用名称。例如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实例。
此数据结构是否有通用名称?
答案 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以及这两篇博文:1,2),并且有一般应用程序流处理(如迭代)。
它在很多方面类似于协程,但它是一个更具体的概念。我链接的两个博客文章称它们为协同程序,因此“coroutine”肯定是引用它的常用方法,但精确的名称是自动机箭头。
答案 1 :(得分:8)
我将该数据结构称为Coroutine。
它表示可以与其他计算并行控制的计算,并且可以逐步评估。虽然你提供的接口不是用于Haskell中的Coroutines类的确切接口(更通用的Coroutine也是monad-anostic,意味着包装函数返回m (R a b, b)
,而协同程序没有要消耗输入,而你在这里总是要用a
来提供计算,它就足够了。
数据结构也代表了所谓的Comonads的一个子集。
答案 2 :(得分:3)
该类型看起来与我期望用于传感器的类型有关 - 我只希望输出类型是单向的。维基百科有一个关于特定类别传感器的页面finite state transducers,它应该是文献检索的一个很好的起点。