2011-12-07 2 views
7

私はいくつかの入力データ型から出力データ型にストリームトランスフォーマを書きます。入力はユーザーによって行われるため、イベント間には時間があります。各入力はいくらかのリソースのロードを必要とするので、私は「未来を調べる」、すなわちすべての可能な入力を主計算に送り、その結果に基づいてリソースを事前ロードしたいと思う。オートマトンのように使用できるモナドはありますか?

現在、入力ごとに常に正確に1つの出力がありますが、最終的にこれを変更するのが面白くなる可能性があります。

Ross Patersonのオートマトントランスで実装するのに成功しました。私のソリューションが最適であるかどうかはわかりません。

  • これを行うには良い例がありますか?おそらくテストコードでさえ?
  • モナドでも達成できますか? (例?,説明それは不可能だ理由は?)

編集: もっと詳細のための呼び出しの後、私はここにコードを追加しました。今私はそれを(それは理解できない)削除し、いくつかの他の説明を追加します。私の質問は答えています。

私の意図は、矢印/ストリームトランスフォーマーに供給された各ユーザー入力の後にメインイベントループを停止させることでした。次に、現在のオートマトンの状態を保存し、可能なすべての入力(偽のイベント)を1つずつオートマトンに送信し、ロードする必要があるリソースを見てキャッシュします。次の実際のイベントの後、より良い応答性のためにキャッシュを使用します。主な計算はこれによって影響を受けるべきではありません。

+0

回答は得られていませんが、繰り返しが役立つ場合があります。このライブラリを参照してください:http://hackage.haskell.org/package/enumerator ...しかし矢印は良い抽象的に見えます。もっと具体的には人々の答えに役立つでしょう。より具体的には、 – jberryman

+0

+1。 – sclv

答えて

8

あなたが言及したすべての使用例は、Netwireライブラリでカバーされています。それはワイヤー矢の家族にロスのオートマトンの矢印の一般化を提供します。 wiki pageはまだ完成していませんが、開始するには十分なものです。

これをいくつかのモナドのためにKleisli (LogicT m)と組み合わせると、非決定的な配線が発生します。m

さらに注意してください:あなたが望むものはモナドではありません。

+1

Hallo Ertes! なぜこれがモナドではないのか説明できますか? – Duschvorhang

+0

@Duschvorhang:矢印はモナドの一般化です。 [Haskell wiki> arrow](http://haskell.org/haskellwiki/Arrow)を参照してください。 –

+0

@Duschvorhang:John Hughesの[Monads to Arrows]の§3.0のパーサの例で同様の制限があります(http: //www.ittc.ku.edu/Projects/SLDG/filing_cabinet/Hughes_Generalizing_Monads_to_Arrows.pdf)、矢印が必要な表現力を提供する方法を注意深く説明してください。それだけでなく、素晴らしい読書です。 – acfoltzer

関連する問題