7

私は、WPF または AngularJS の型で Haskell で MVC フレームワークを構築する方法について熟考してきましたが、開始するための主要なタイプまたはアイデアを見つけることができないようです。残念ながら漠然とした質問ですが、この問題について考えている人は他にいますか?

編集レンズ、マルチプレート、コンポも見かけますが、それらはすべて少しずつ異なる問題を解決していると思います。

それがどのように機能するかの大まかなスケッチは次のとおりです。

  1. プレーンな Haskell データ構造としてモデルを作成する
  2. モデルを変更するための一連の「レンズ」またはコマンドを作成します。
  3. モデルの型によってパラメーター化された 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)]

問題は、あるデータ構造を操作し、別のデータ構造の変化を記述するために使用できるレンズのタイプは何かということだと思います。

1 つの可能性は、すべてのレンズをラップする GADT を作成し、次に各ステップでテンプレートと照合するために使用できる GADT タイプで HTML をテンプレート化することです。例えば

data Lenses a b where
    Title :: Lens Model String -> Lenses Model String
    Item  :: Lens Model String -> Lenses Model (Maybe String)

次に、Html Template データ型。

data HtmlTemplate a = Text String 
              | Element String [Attrib a] 
              | forall b. Binding (Lenses a b) (Html b)

Binding 要素を直接パターン マッチングできる対象。

しかし、モデルはヒップでビューに結合されるため、それはほとんどポイントを無効にしているように見えます.

これがどのように機能するかについて、誰か (私より賢い) が考えたことはありますか? それとも、これは良い考えですか?

4

1 に答える 1

9

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

  • 純粋に機能的なデータ構造
  • 設定と取得 (およびデータの一貫性を維持するため) のレンズ
  • 各レンズに関連付けられたビュー (テンプレート) を生成するための DSL。

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

このアプローチでは、

  • ハックするのではなく、レンズを内部モデルへの安全なインターフェースとして使用する
  • モデルの強力な分離 -> ビュー
  • すべてのタイプ チェック -- ビュー コードを生成するためのレンズ タイプ

デザインの仕方はいろいろありますが、とても健全なデザインのアプローチだと思います。GUI 部分の優れた DSL サポートが必要になります。

于 2012-04-26T17:21:24.980 に答える