Wpf 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

我一直在考虑如何以WPF或AngularJS的模式在Haskell中构建MVC框架,但似乎找不到开始的关键类型或想法。不幸的是,这个模糊的问题——有没有其他人想过这个问题

我看到了编辑镜头、多片和复合镜头,但我认为它们解决的问题略有不同

我对这将如何工作的粗略描述是:

  • 将模型创建为普通haskell数据结构
  • 创建一组“镜头”或命令来修改模型
  • 编写一个由模型中的类型参数化的HTML(或其他)模板
  • 然后我希望能够编写一个函数:

    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)