Elm 右边有两个值的函数意味着什么?(型号->;Html消息)

Elm 右边有两个值的函数意味着什么?(型号->;Html消息),elm,Elm,我在指南中遇到过: viewValidation : Model -> Html msg viewValidation model = let (color, message) = if model.password == model.passwordAgain then ("green", "OK") else ("red", "Passwords do not match!") in div [ style

我在指南中遇到过:

viewValidation : Model -> Html msg
viewValidation model =
  let
    (color, message) =
      if model.password == model.passwordAgain then
        ("green", "OK")
      else
        ("red", "Passwords do not match!")
  in
    div [ style [("color", color)] ] [ text message ]
这是一个函数,它采用
模型
Html-msg
在我看来,通常我们调用的是带有参数
msg
的函数
Html


msg
似乎在
viewValidation
函数的任何其他部分中都不起任何作用。那么它是什么意思?在这种情况下它是干什么的?

Html Msg
只是一个类型参数,就像
List Int
一样。虽然
List Int
表示包含
Int
类型元素的列表,但类似地
Html Msg
描述了一些可以处理/发出
Msg
类型消息的Html

例如,如果HTML中有一个按钮,它可能如下所示:

button [ onClick DoSomething ] [ text "caption" ]

其中
DoSomething
Msg
类型的一种情况。

不要将类型定义与代码的正常执行混为一谈
Html
不是一个函数,它是一种使用参数定义视图函数类型的类型

Html-msg
是最通用的定义,因为
msg
本身是一个变量,因此返回的Html与当前使用的msg类型无关。这可能是因为它不创建事件消息,也可能是因为view函数将消息作为参数

正如所建立的注释一样,
Html()
将是一种非常狭窄的类型,它被限制为不返回任何内容

不过,最常见的情况是返回
Html Msg
的视图函数,即返回基于用户交互的消息的Html

由于Elm鼓励组件化,您还需要记住
Html.map
。它的类型签名是
Html.map:(a->b)->HTMLA->HTMLB
。在组件上下文中,这更容易理解为

Html.map : (Child.Msg -> Parent.Msg) -> Html Child.Msg -> Html Parent.Msg
请注意,当您在父组件中定义消息时,您将有如下内容:

type Msg = ChildMsg Child.Msg
这意味着
ChildMsg
具有类型签名:

ChildMsg : Child.Msg -> Parent.Msg
所以我的视图函数有很多

parentView model = 
  -- childView model.child |> Html.map ChildMsg
  Html.map ChildMsg (childView model.child)

不过,如果我没有弄错的话,
viewValidation
不会触发任何
msg
,对吗?是的,你是对的。由于
List
需要使用参数定义(您可以使用
List a
),即使该参数为空,
Html
也需要使用参数定义,即使未使用该参数。如果需要,可以使用
htmla
如果它不返回任何内容,也可以使用Html()。请参阅:您不想使用()。相反,将其保留为类型变量msg,以后可以将其实例化为所需的任何类型。除非您需要保证不会发送任何消息,…
Html msg
具有误导性和迷惑性!如果有,请使用
HTMLA