私は、HaskellでMVCフレームワークをWPFやAngularJSでどのように構築するのかを考えていましたが、キータイプやアイデアを見つけることができないようです開始しました。残念ながら漠然とした質問です。他の誰かがこの問題を考えていますか?HaskellのMVCフレームワーク用レンズ
私は編集レンズ、マルチプレート、およびコンポジットを参照していますが、それらはすべてわずかに異なる問題を解決すると思います。それがどのように動作するかの
私のラフスケッチは次のようになります。
- プレーンHaskellのデータ構造としてモデルを作成「レンズ」のセットを作成したり、モデルを修正するためのコマンド。
- モデル内の型によってパラメータ化されたHTML(または何でも)テンプレートを記述します。
。
data Model = Page { _title :: String, _content :: [(Int, String)] }
title :: Lens Model String
content :: Int -> Lens Model (Maybe String)
それから私は、関数を記述できるようにしたいでしょう:
Model -> Template Model -> Html
と私はレンズを適用するときに私の見解の一部を更新する機能。
Lens Model a -> a -> HtmlTemplate Model -> [(Path, Html)]
だから私は、あるタイプのレンズではどのタイプのレンズが動作し、別のタイプのレンズでの変更を記述するのに使われるのだろうと思います。
すべてのレンズをラップしたGADTを作成し、次に各ステップでテンプレートと照合するために使用できるGADTタイプにHTMLをテンプレートすることが考えられます。例えば
data Lenses a b where
Title :: Lens Model String -> Lenses Model String
Item :: Lens Model String -> Lenses Model (Maybe String)
次に、Htmlテンプレートデータタイプ。
data HtmlTemplate a = Text String
| Element String [Attrib a]
| forall b. Binding (Lenses a b) (Html b)
これは、Binding要素を直接パターンマッチングすることができます。
しかし、このモデルは、ヒップでビューに結合されているので、その点をほぼ打ち破っているようです。
これはどういう仕組みになっているのだろうと考えている人がいるのだろうか?または、これが良い考えであっても?
私は、あなたが見たいと思うかもしれない任意の効果的な操作をサポートするための実験的なレンズライブラリを開始しました(APIの変更、実験的でラウンド的それがredditで議論されたときshat)。あなたのケースに最も近いのは[この投稿](http://brandon.si/code/yall/)の最後の例です。 'LensM(State View)Model a'などのように、モデル上でレンズオプションを実行するときに、' State'であなたのビューを変更したいと思うでしょう。 MVCパターンをあまり使用していないので、もし私がオフの場合は私を許してください – jberryman
私はそれが解決策の少なくとも半分だと思うので、ビューに変更を加えたり、ビューを直接変更したりすることができます。 。しかし、私が見逃しているのは、モデルとビュー(テンプレートモデル)を一緒にトラバースするメカニズムです。同時に、2つの関連する構造を横断するためのいくつかの種類のジップです。 – Oliver
あなたはhttp://www.haskellforall.com/2014/04/model-view-controller-haskell-style.htmlに興味があるかもしれません。 – hdgarrood