Elm:如何创建一个没有 return Msg 的视图?

Elm: How to create a view that doesn't return Msg?

目前,我有一个仅显示错误文本的嵌套组件。视图方法接收 Model 和 returns 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

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

谢谢!

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

您总是可以定义类型别名以避免每次都键入 ()

type alias OnlyHtml = Html ()

然后您可以适当地更改您的类型签名:

view: Model -> OnlyHtml

使用 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!