【问题标题】:Name of type pattern: R a b = Q (a -> (R a b,b))类型模式名称: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)

标签: haskell data-structures types terminology


【解决方案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 和这两篇博文:12),并适用于一般流处理(如 iteratees)。

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

【讨论】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多