8

私はコンビネータについて読んでいて、それらがどれほど有用であるかを見てきました(たとえば、HaskellのParsecで)。私の問題は、それらを実際にどのように使用するかがよくわからないことです。

問題の概要は次のとおりです。ディストリビューションは、生成、フィルタリング、および変更できます。ディストリビューションを組み合わせて、新しいディストリビューションを作成できます。

基本的なインターフェースは(疑似Haskellタイプの用語で):

generator::      parameters -> distribution

selector::       parameters -> (distribution -> distribution)

modifier::       parameters -> (distribution -> distribution)

今、私は3つのコンビネータを見ていると思います。

combine::     generator -> generator -> generator

filter::      generator -> selector -> generator

modify::      generator -> modifier -> generator

これらは実際にコンビネータですか?コンビネータは理にかなっていますか/私が見逃している他の明らかなコンビネータはありますか?

アドバイスありがとうございます。

4

1 に答える 1

5

selectorandmodifier関数はすでに完全に優れたコンビネータです!と一緒にgeneratorcombineあなたは次のようなことをすることができます(私は具体性のために統計的分布を仮定し、ただ物事を作り上げるつもりです!):

modifier (Scale 3.0) $ generator StandardGaussian `combine` selector (LargerThan 10) . modifier (Shift 7) $ generator (Binomial 30 0.2)

これがスムーズに機能するためには、結合演算子の優先順位を少し混乱させる必要があるかもしれません:)

一般に、タイプの値のコンビネータライブラリを設計しようとしているときは、部分的に適用されたコンビネータ(yourと)をチェーン化できるようAに、'sを「最後」に保持するのが好きです。フープを通して。Aselectormodifier.flip

これは、コンビネータの設計に役立つ素晴らしいブログ記事です。これは、私の考えの多くに影響を与えました。セマンティックエディタコンビネータ

編集:型署名が。の場合、あなたの質問を読み間違えた可能性がありますcombine。何かが足りないかもしれませんが、ディストリビューションは、コンビネータが機能する必要のあるより自然なオブジェクトではないでしょうか。

于 2011-08-16T19:26:52.590 に答える