Wpf Haskell中MVC框架的镜头
我一直在考虑如何以WPF或AngularJS的模式在Haskell中构建MVC框架,但似乎找不到开始的关键类型或想法。不幸的是,这个模糊的问题——有没有其他人想过这个问题 我看到了编辑镜头、多片和复合镜头,但我认为它们解决的问题略有不同 我对这将如何工作的粗略描述是:Wpf Haskell中MVC框架的镜头,wpf,model-view-controller,haskell,Wpf,Model View Controller,Haskell,我一直在考虑如何以WPF或AngularJS的模式在Haskell中构建MVC框架,但似乎找不到开始的关键类型或想法。不幸的是,这个模糊的问题——有没有其他人想过这个问题 我看到了编辑镜头、多片和复合镜头,但我认为它们解决的问题略有不同 我对这将如何工作的粗略描述是: 将模型创建为普通haskell数据结构 创建一组“镜头”或命令来修改模型 编写一个由模型中的类型参数化的HTML(或其他)模板 然后我希望能够编写一个函数: Model -> Template Model -> Ht
Model -> Template Model -> Html
还有一个功能,当我使用镜头时,可以更新部分视图
Lens Model a -> a -> HtmlTemplate Model -> [(Path, Html)]
所以我猜问题是-镜头会采取什么类型,可以在一个数据结构上运行,然后用来描述另一个数据结构中的变化
一种可能性似乎是创建一个GADT,它包装了所有的镜头,然后在GADT类型上模板化HTML,然后可以在每个步骤中使用它来匹配模板。e、 g
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)
绑定元素可以直接与之进行模式匹配
但这似乎几乎违背了这一点,因为模型在臀部与视图相连
我想知道有没有人(比我聪明的人)考虑过这可能是怎么回事?或者即使这是个好主意 我一直在Haskell使用基于镜头的“MVC”构建一个大型商业应用程序
- 纯功能数据结构
- 用于设置和获取(并保持数据一致)的镜头
- 用于生成绑定到每个镜头的视图(模板)的DSL
- 不是黑客,而是使用镜头作为内部模型的安全接口
- 模型->视图的强分离
- 所有内容的类型检查--生成视图代码的镜头类型
有很多方法可以设计它,但我认为这是一种非常合理的设计方法。您需要良好的DSL对GUI部分的支持。我已经启动了一个实验性的lens库,旨在支持任意有效的操作,您可能会对此感兴趣(目前不建议您使用它,因为API将发生变化,它是实验性的,在reddit上讨论时被彻底抛弃)。与您的案例最接近的是中的最后一个示例;在模型上执行镜头操作时,您可能希望在
状态下修改视图:LensM(状态视图)模型a
或类似的内容。但是我没有太多地使用MVC模式,所以请原谅我,我认为这至少是解决方案的一半,因此您可以构建对视图的更改(或者直接修改视图)。然而,我认为我缺少的是一种同时遍历模型和视图(模板化模型)的机制——某种同时遍历两个相关结构的zip。你可能会感兴趣,你能详细介绍一下“用于生成绑定到每个镜头的视图(模板)的DSL”吗?听起来很酷。基本上,是一种模板语言,它将屏幕上的键入控件与其对应的镜头相关联。因此,按钮、文本输入、数字输入等可以链接到该输入的编辑镜头,这些镜头的图形可以连接起来。然后UI就掉出来了。听起来不错。我想使用类似的方法,使用Html作为UI来制作本地web应用程序。(或者有一天使用UHC Javascript)。干杯:)@Oliver听起来很像formlets
data HtmlTemplate a = Text String
| Element String [Attrib a]
| forall b. Binding (Lenses a b) (Html b)