Haskell中MVC框架的镜头

Oli*_*ver 7 wpf model-view-controller haskell

我一直在考虑如何在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)
Run Code Online (Sandbox Code Playgroud)

然后我希望能够编写一个函数:

Model -> Template Model -> Html
Run Code Online (Sandbox Code Playgroud)

以及在我应用镜头时更新部分视图的功能.

Lens Model a -> a -> HtmlTemplate Model -> [(Path, Html)]
Run Code Online (Sandbox Code Playgroud)

所以我想问题是 - 镜头采用哪种类型可以在一个数据结构上运行,然后用于描述另一个数据结构的变化.

一种可能性似乎是创建一个包装所有镜头的GADT,然后在GADT类型上模板化HTML,然后可以在每一步使用它来匹配模板.例如

data Lenses a b where
    Title :: Lens Model String -> Lenses Model String
    Item  :: Lens Model String -> Lenses Model (Maybe String)
Run Code Online (Sandbox Code Playgroud)

然后是Html模板数据类型,例如

data HtmlTemplate a = Text String 
              | Element String [Attrib a] 
              | forall b. Binding (Lenses a b) (Html b)
Run Code Online (Sandbox Code Playgroud)

Binding元素可以直接与其进行模式匹配.

但这似乎几乎打败了这一点,因为模型随后加入了视野.

我想知道有没有人(比我更聪明)考虑这可能如何起作用?或者即使这是一个好主意?

Don*_*art 9

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

  • 纯功能数据结构
  • 用于设置和获取(并保持数据一致)的镜头
  • 用于生成绑定到每个镜头的视图(模板)的DSL.

这是一次很棒的经历,我绝对推荐用于复杂结构的详细结构编辑的方法.

这种方法迫使你

  • 不是黑客,而是使用镜头作为内部模型的安全接口
  • 强烈分离模型 - >视图
  • 键入检查所有内容 - 镜头类型以生成视图代码

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

  • 你能详细说明"用于生成与每个镜头相关的视图(模板)的DSL吗?"?听起来很酷. (2认同)