私は、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)]
問題は、あるデータ構造を操作し、別のデータ構造の変化を記述するために使用できるレンズのタイプは何かということだと思います。
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 要素を直接パターン マッチングできる対象。
しかし、モデルはヒップでビューに結合されるため、それはほとんどポイントを無効にしているように見えます.
これがどのように機能するかについて、誰か (私より賢い) が考えたことはありますか? それとも、これは良い考えですか?