我一直在思考如何在Haskell中构建一个WPF或AngularJS模型的MVC框架,但似乎无法找到关键类型或想法获得开始。所以很不幸含糊的问题 - 有没有其他人一直在想这个问题?Haskell MVC框架镜头
我看到编辑镜头,多板和Compos,但我认为他们都解决了稍有不同的问题。
我如何将工作将草图:
- 创建一个模型作为一个普通的Haskell数据结构
- 创建一组的“镜头”或命令来修改模型。
- 编写一个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元素可以与其直接模式匹配。
但是,这似乎几乎击败了这一点,因为模型然后在臀部加入视图。
我想知道有人(比我聪明)想出了这可能如何工作?或者即使这是一个好主意?
我已经开始了一个实验镜头库,旨在支持任意有效的操作,您可能有兴趣查看这些操作(目前不推荐您使用它,因为API将会改变,它是实验性的,而且是圆滑的在reddit上讨论它时)。最接近你的案例将是[本文]中的最后一个例子(http://brandon.si/code/yall/);当你在模型上做Lens操作时,你可能希望在'State'中修改你的视图:'LensM(State View)Model a'或类似的东西。但我还没有使用MVC模式太多,所以请原谅我,如果我关闭 – jberryman 2012-04-26 22:23:45
我认为这至少是解决方案的一半,以便您可以构建对视图的更改(或直接修改视图) 。不过我想我缺少的是一种机制来同时遍历模型和视图(模板模型) - 某种拉链来同时遍历两个相关结构。 – Oliver 2012-04-27 03:36:38
你可能会对http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood 2014-04-27 19:47:29