2012-02-28 16 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

+0

@amindfy:あなたは正しいです。私はそれを修正しました。ありがとうございました。 –

+1

@ JohnF.Millerは、 'T a'のどこかに' a'を保存したくないですか? :D(申し訳ありませんが...私は...)(または多分それはファントムタイプです!?:p) – Ptival

答えて

23

これは、Mealyマシンとも呼ばれるautomaton arrowです。具体的な例では、基本的な矢印として(->)を使用しています。もう1つの一般的な選択は、一部のモナドのKleisli mm(をa -> m bに変換するだけです(例:data R a b = Q (a -> MyMonad (b, R a b)))です。

これは、一般的に(具体的には、FRPをarrowised - 例えばnetwireこれら二つのブログの記事を参照してください:21functional reactive programmingで使われている、と(iterateesのような)一般的なストリーム処理にアプリケーションを持っています。

これは多くの点でコルーチンと似ていますが、より具体的な概念です。私がリンクしている2つのブログ記事はコルーチンと呼ばれているので、「コルーチン」は確かにそれを参照する一般的な方法ですが、正確な名前はオートマトンの矢印です。

+1

これは私が探していた以上のものです。非常に完全な答えをありがとう。 –

8

私はそのデータ構造をコルーチンと呼んでいます。

これは、他の計算と並行して制御できる計算を表し、段階的に評価することができます。あなたが提示するインターフェースは、HaskellのCoroutinesのクラスに使用されているインターフェースではありませんが(より一般的なコルーチンはモナドには依存しません。つまり、ラップされた関数はm (R a b, b)を返し、コルーチンは入力を消費する必要はありません。あなたはここで常に計算をaとしなければなりません)、それは十分に似ています。

データ構造は、Comonadsと呼ばれるもののサブセットを表します。

3

このタイプは、トランスデューサの場合に使用すると予想されるタイプに関係しています。 - 出力タイプがモノイドであると予想します。ウィキペディアには、特定の種類のトランスデューサに関するページがあります(finite state transducers)。これは文献検索の出発点です。

関連する問題