我一直在考虑如何像WPF或AngularJS那样在Haskell中构建一个MVC框架,但似乎找不到开始的关键类型或思路。因此,很遗憾,我的问题很笼统:还有其他人在考虑这个问题吗?
我看到了edit-lenses、multi-plate和Compos,但我认为它们都解决了稍微不同的问题。
我对如何实现的初步想法是:
1.创建一个模型作为纯Haskell数据结构
2.创建一组“镜头”或命令来修改模型。
3.编写一个HTML(或任何其他)模板,该模板参数化了模型中的类型。
然后我希望能够编写一个函数:
然后是一个 HTML 模板数据类型,例如:
我看到了edit-lenses、multi-plate和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)
可以直接与绑定元素进行模式匹配。
但这似乎几乎是在打击要点,因为模型随后与视图紧密结合。
我想知道有没有任何比我更聪明的人考虑过这可能如何工作?或者这是否是个好主意?
State
中修改你的视图:LensM (State View) Model a
或类似的东西。但我没有经常使用MVC模式,所以如果我说错了,请原谅。 - jberryman