【问题标题】:Elm: How to create a view that doesn't return Msg?Elm:如何创建一个不返回 Msg 的视图?
【发布时间】:2016-05-16 15:19:13
【问题描述】:

目前,我有一个仅显示错误文本的嵌套组件。 view 方法接收到Model 并返回Html,但是编译器抱怨说 Html 需要另一个值,所以我最终这样做了:

view: Model -> Html ()
view error =
    div [class "docs-section error-bar"] [
      errorText error
    ]

errorText: Model -> Html ()
errorText error =
  case error.text of
    Nothing -> span [][]
    Just value -> text value

我不喜欢的是我必须将() 值添加到签名中。有什么办法可以摆脱这个吗?

谢谢!

【问题讨论】:

    标签: elm


    【解决方案1】:

    Html type 只需要一个参数,所以你总是必须给出 something。使用() 作为类型参数是在其中放置虚拟值的常用方法。

    你总是可以定义一个类型别名来避免每次都输入()

    type alias OnlyHtml = Html ()
    

    然后你可以适当地改变你的类型签名:

    view: Model -> OnlyHtml
    

    【讨论】:

    • 谢谢!我喜欢别名。 =)
    【解决方案2】:

    使用Html () 会使您更难将这个视图与 发送消息的视图组合在一起。相反,请使用类型变量:view: Model -> Html msg

    小写的m 非常重要:它意味着这个HTML 可以发送任何类型的消息。除此之外,发送未知类型的消息会破坏类型系统,因此它不能发送任何消息。如果这看起来很奇怪,请考虑 x : List a 意味着 x 的元素是任意类型的,因此不存在这样的元素:x == []

    使用类型变量是函数最通用的类​​型。使用() 所做的只是提供更具体的注释,这是允许的。这就像声称空列表实际上是一个字符串列表:当然,但是您所做的只是使该值对于需要其他类型列表的函数不可接受。这就是我所说的Html () 很难在没有其他视图的情况下撰写。

    viewMsg : Html Msg
    viewUnit : Html ()
    viewTypeVariable : Html msg
    
    views = [viewMsg, viewTypeVariable] -- This is okay
    views = [viewMsg, viewUnit] -- This is a type error!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多