2012-04-26 10 views
7

私は、HaskellでMVCフレームワークをWPFやAngularJSでどのように構築するのかを考えていましたが、キータイプやアイデアを見つけることができないようです開始しました。残念ながら漠然とした質問です。他の誰かがこの問題を考えていますか?HaskellのMVCフレームワーク用レンズ

私は編集レンズ、マルチプレート、およびコンポジットを参照していますが、それらはすべてわずかに異なる問題を解決すると思います。それがどのように動作するかの

私のラフスケッチは次のようになります。

  1. プレーンHaskellのデータ構造としてモデルを作成「レンズ」のセットを作成したり、モデルを修正するためのコマンド。
  2. モデル内の型によってパラメータ化された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要素を直接パターンマッチングすることができます。

しかし、このモデルは、ヒップでビューに結合されているので、その点をほぼ打ち破っているようです。

これはどういう仕組みになっているのだろうと考えている人がいるのだろうか?または、これが良い考えであっても?

+1

私は、あなたが見たいと思うかもしれない任意の効果的な操作をサポートするための実験的なレンズライブラリを開始しました(APIの変更、実験的でラウンド的それがredditで議論されたときshat)。あなたのケースに最も近いのは[この投稿](http://brandon.si/code/yall/)の最後の例です。 'LensM(State View)Model a'などのように、モデル上でレンズオプションを実行するときに、' State'であなたのビューを変更したいと思うでしょう。 MVCパターンをあまり使用していないので、もし私がオフの場合は私を許してください – jberryman

+0

私はそれが解決策の少なくとも半分だと思うので、ビューに変更を加えたり、ビューを直接変更したりすることができます。 。しかし、私が見逃しているのは、モデルとビュー(テンプレートモデル)を一緒にトラバースするメカニズムです。同時に、2つの関連する構造を横断するためのいくつかの種類のジップです。 – Oliver

+0

あなたはhttp://www.haskellforall.com/2014/04/model-view-controller-haskell-style.htmlに興味があるかもしれません。 – hdgarrood

答えて

9

私はHaskellのレンズベースの「MVC」を使用して大規模な商用アプリケーションを構築してきました。

  • 純粋に機能的なデータ構造を設定し、取得(及び一貫性のあるデータを保持)するための
  • レンズ
  • DSL各レンズに接続ビュー(テンプレート)を生成します。

これは素晴らしい経験であり、複雑な構造の詳細な構造編集のアプローチをお勧めします。

  • アプローチ力あなたはハックが、あなたの内部モデル

  • モデルの強力な分離に使用するレンズのような安全なインタフェースなし - すべてのチェック>ビュー
  • タイプ - レンズタイプビューコードを生成するには

デザイン方法はたくさんありますが、非常に健全なデザインアプローチだと思います。あなたは、GUIの部分のための良いDSLのサポートが欲しいでしょう。

+2

「各レンズに結びついたビュー(テンプレート)を生成するためのDSL "?クールな音。 – jberryman

+1

基本的には、入力されたコントロールを画面上の対応するレンズに関連付けるテンプレート言語です。ボタン、テキスト入力、数値入力などをその入力用の編集レンズにリンクすることができ、そのようなレンズのグラフを配線することができます。その後、UIはただ落ちるだけです。 –

+0

いいですね。私は同様の方法でUIとしてHtmlを使ってローカルWebアプリケーションを実行したい。 (またはUHC Javascriptでいつか)。乾杯! – Oliver