セットアップ:私は、様々なデータ構造魔女のいくつかのコレクションを有する更新要素
は、仮想システムにシミュレートされたオブジェクトの状態を表します。私はまた、これらのオブジェクトを元の0個以上のパラメータに基づいて変換する多数の関数を持っています。
目的は、(シミュレーションのルール内で)変換を適用するオブジェクトを選択し、それらのオブジェクトにそれらの関数を適用し、古いオブジェクトを新しいものに置き換えてコレクションを更新することです。
小さな変換をより大きな変換に組み合わせることで、このタイプの関数を構築したいと考えています。次に、この結合された関数を評価する。
質問:
どのように私はこれを可能にする私のプログラムを構築するには?
このようなトランザクションを構築するためにどのようなコンビネータを使用しますか?
アイデア:
- 1つの巨大な構造にすべてのコレクションを入れて、この構造を周りに渡します。
官能性反応プログラミングフレームワークを使用し
3はうまくいくように見えますが、OOPを再現するように見えるようになります。私はまた、IORefをどのレベルで使うべきかも分かりません。 (例えばIORef (Collection Obj)
またはCollection (IORef Obj)
またはdata Obj {field::IORef(Type)}
)
4は、スタイルの中で最も機能を感じているが、また、表現力の面で多くのペイオフせずにコードの複雑さの多くを作成しているようです。
例
私は、Webストアフロントを持っています。私は在庫の数量と価格を(他のものの中でも)商品のコレクションを維持しています。また、店舗にクレジットを持っているユーザーの集まりもあります。
ユーザーは、andsが購入する3つの製品を選択し、店舗クレジットを使用してチェックアウトするようになります。私は、3つの製品の在庫量を減らした新しい製品コレクションを作成する必要があります。ユーザーアカウントを借りて新しいユーザーコレクションを作成します。
これは私が次のことを得ることを意味:
checkout :: Cart -> ProductsCol -> UserCol -> (ProductsCol, UserCol)
しかし、その後の人生はもっと複雑になると、私は税に対処する必要があります。
checkout :: Cart -> ProductsCol -> UserCol -> TaxCol
-> (ProductsCol, UserCol, TaxCol)
そして、私は順番を追加してくださいする必要があります
checkout :: Cart
-> ProductsCol
-> UserCol
-> TaxCol
-> ShipList
-> (ProductsCol, UserCol, TaxCol, ShipList)
などなど...
:出荷キューへ私が書きたい何は
checkout = updateStockAmount <*> applyUserCredit <*> payTaxes <*> shipProducts
applyUserCredit = debitUser <*> creditBalanceSheet
のようなものであるが、型チェッカは、私に卒中行かなければなりません。 checkout
またはapplyUserCredit
の機能がモジュール化され抽象化された状態でこのストアを構成するにはどうすればよいですか?私はこの問題を抱える唯一の人にはなりませんよね?
ちょうど明白である:あなたは様々な特定のタイプAに対して、 'A - > A 'に似ているタイプの様々な機能を持っています。それらを複合アクションに結合して、何らかの種類の共有状態を更新できるようにする必要があります。共有された状態にあるすべての機能をすべての機能に認識させたくないのですか? –
C.A.McCann:正解。いくつかのものは、それらをカリングすることによって 'B - > A - > A'のようなものから派生する必要があるかもしれません。 –