右侧2个值的函数是什么意思? (型号 - > Html消息)

时间:2016-05-21 13:02:46

标签: elm

我在指南中遇到过:

Model

所以这是一个函数,它取Html msgHtml通常会向我看,就像我们使用参数msg调用函数msg

viewValidation似乎在map函数的任何其他部分中都没有扮演任何角色。那么这是什么意思呢?在这种情况下它是什么意思?

2 个答案:

答案 0 :(得分:13)

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

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

Msg

其中button [ onClick DoSomething ] [ text "caption" ] DoSomething类型的情况。

答案 1 :(得分:8)

不要将类型定义与正常的代码执行混合。 Html不是函数,它是一个带参数来定义视图函数类型的类型。

Html msg是您可以拥有的最通用的定义,因为msg本身就是一个变量,所以这会返回独立于您当前使用的msg类型的Html。这可能是因为它没有创建事件消息,或者因为视图函数将消息作为参数。

由于建立的评论Html ()将是一个非常狭窄的类型,但不能返回任何内容。

最常见的情况是返回Html Msg的视图函数 - 即带有基于用户交互的消息的Html。

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

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)