2012-02-28 126 views
15

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

我想知道,如果这样的形状有一个名字:

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

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

这个数据结构有一个共同的名字吗?

+8

你有盆景树:)。更好的二叉树是'T a = Branch(T a)(T a)|叶a' – amindfv 2012-02-28 20:46:38

+0

@amindfy:你是对的。我修复了它。谢谢。 – 2012-02-28 23:44:04

+1

@ JohnF.Miller你不想在'T a'的某个地方存储一些'a'吗? :D(对不起......我不得不...)(或者这可能是一个幻影类型!?:p) – Ptival 2012-02-28 23:54:01

回答

23

这是一个automaton arrow,也被称为粉碎机。您的具体示例仅使用(->)作为底层箭头;另一种常见选择是某些单子的Kleisli mm(它只是将a -> b转换为a -> m b;例如data R a b = Q (a -> MyMonad (b, R a b)))。

它在functional reactive programming常用的(具体而言,arrowised FRP - 见,例如netwire这两个博客文章:12),并具有应用到一般流处理(如iteratees)。

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

+1

这正是我所寻找的和更多。感谢您提供非常完整的答案。 – 2012-02-28 23:47:05

8

我会称之为数据结构的一个协程。

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

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

3

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

相关问题