我一直在考虑如何在 WPF 或 AngularJS 的模具中在 Haskell 中构建 MVC 框架的想法,但似乎无法找到开始的关键类型或想法。所以不幸的是一个模糊的问题——还有其他人在考虑这个问题吗?
我看到了编辑镜头、多板和 Compos,但我认为它们都解决了略有不同的问题。
我对它如何工作的粗略草图是:
- 将模型创建为普通的 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 元素可以直接与其进行模式匹配。
但这似乎几乎否定了这一点,因为模型然后在臀部与视图相连。
我想知道那里有没有人(比我聪明)考虑过这可能如何工作?或者即使这是个好主意?