我一直在思考如何在WPF或AngularJS模式下的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
    

    以及当我使用镜头时可以更新部分 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”构建大型商业应用程序。

  • 纯功能数据结构
  • 设置和获取(并使数据保持一致)的镜头
  • 用于生成绑定(bind)到每个镜头的 View (模板)的DSL。

  • 这是一个很好的经验,我绝对推荐对复杂结构进行详细结构编辑的方法。

    该方法迫使您
  • 不会入侵,但可以将镜头用作内部模型的安全接口(interface)
  • 模型的强分离->查看
  • 对所有内容进行类型检查-镜头类型以生成 View 代码

  • 您可以通过很多方法进行设计,但是我认为这是一种非常合理的设计方法。您将需要GUI部分提供良好的DSL支持。

    关于wpf - Haskell中的MVC框架镜头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10338131/

    10-13 08:54