Oli*_*ver 7 wpf model-view-controller haskell
我一直在考虑如何在WPF或AngularJS的模型中在Haskell中构建MVC框架的想法,但似乎无法找到开始的关键类型或想法.所以不幸的是模糊的问题 - 还有其他人在考虑这个问题吗?
我看到编辑镜头,多盘和复合材料,但我认为它们都解决了稍微不同的问题.
我将如何运作的粗略草图将是:
.
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元素可以直接与其进行模式匹配.
但这似乎几乎打败了这一点,因为模型随后加入了视野.
我想知道有没有人(比我更聪明)考虑这可能如何起作用?或者即使这是一个好主意?
我一直在Haskell中使用基于镜头的"MVC"构建一个大型商业应用程序.
这是一次很棒的经历,我绝对推荐用于复杂结构的详细结构编辑的方法.
这种方法迫使你
有很多方法可以设计它,但我认为这是一种非常合理的设计方法.您需要为GUI部分提供良好的DSL支持.