我一直在思考如何在WPF或AngularJS模式下的Haskell中构建MVC框架的想法,但似乎找不到入门的关键类型或想法。不幸的是,这个问题很模糊-有人在考虑这个问题吗?
我看到了编辑镜头,多板和Compos,但我认为它们都能解决略有不同的问题。
我对此的大致印象是:
。
data Model = Page { _title :: String, _content :: [(Int, String)] }
title :: Lens Model String
content :: Int -> Lens Model (Maybe String)
然后,我希望能够编写一个函数:
Model -> Template Model -> Html
以及当我使用镜头时可以更新部分 View 的功能。
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元素进行模式匹配。
但这似乎差一点了,因为随后将模型与 View 连接在一起。
我想知道有没有人(比我聪明)考虑过这可能如何工作?或即使这是一个好主意?
最佳答案
我一直在Haskell中使用基于镜头的“MVC”构建大型商业应用程序。
这是一个很好的经验,我绝对推荐对复杂结构进行详细结构编辑的方法。
该方法迫使您
您可以通过很多方法进行设计,但是我认为这是一种非常合理的设计方法。您将需要GUI部分提供良好的DSL支持。
关于wpf - Haskell中的MVC框架镜头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10338131/