7

我一直在考虑如何在 WPF 或 AngularJS 的模具中在 Haskell 中构建 MVC 框架的想法,但似乎无法找到开始的关键类型或想法。所以不幸的是一个模糊的问题——还有其他人在考虑这个问题吗?

我看到了编辑镜头、多板和 Compos,但我认为它们都解决了略有不同的问题。

我对它如何工作的粗略草图是:

  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)]

所以我想问题是 - 镜头将采用哪种类型,可以对一种数据结构进行操作,然后用于描述另一种数据结构的变化。

一种可能性似乎是创建一个包含所有镜头的 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 元素可以直接与其进行模式匹配。

但这似乎几乎否定了这一点,因为模型然后在臀部与视图相连。

我想知道那里有没有人(比我聪明)考虑过这可能如何工作?或者即使这是个好主意?

4

1 回答 1

9

我一直在使用 Haskell 中基于镜头的“MVC”构建一个大型商业应用程序。

  • 纯函数式数据结构
  • 用于设置和获取(并保持数据一致)的镜头
  • 用于生成与每个镜头相关的视图(模板)的 DSL。

这是一次很棒的体验,我绝对推荐复杂结构的详细结构编辑方法。

这种方法迫使你

  • 不是破解,而是使用镜头作为内部模型的安全接口
  • 模型->视图的强分离
  • 对所有内容进行类型检查——生成视图代码的镜头类型

有很多方法可以设计它,但我认为这是一种非常合理的设计方法。您需要对 GUI 部分提供良好的 DSL 支持。

于 2012-04-26T17:21:24.980 回答