为什么写 `Html msg` 而不是 `Html a` 是惯用的?
Why is it idiomatic to write `Html msg` instead of `Html a`?
我是 Elm 的初学者。这是关于风格的问题,而不是关于事物如何运作的问题。
例如,在http://elm-lang.org/examples/form中我们有
viewValidation : Model -> Html msg
我知道这样做是为了 viewValidation model
可以与 Html Msg
类型的值共存于同一个列表中。但是,既然这里的 msg
只是一个类型变量,为什么不用更传统的 a
呢?
msg
想要传达什么额外信息?
Elm 架构鼓励对 Model
和 Msg
等类型进行一致的命名,以传达它们的含义。使用小写 msg
只是让意图更清楚一些。
它很可能被命名为 a
,但可以说这并没有传达那么多信息。
编辑
要详细说明,请考虑 elm-lang/html
包的文档。
我们来看看Html.program
的定义:
program :
{ init : (model, Cmd msg)
, update : msg -> model -> (model, Cmd msg)
, subscriptions : model -> Sub msg
, view : model -> Html msg
} -> Program Never model msg
The Elm Architecture 非常清楚地概述了框架如何使用您的 Model
和 Msg
类型来承载状态并指示要执行的操作的意图。通过在整个文档中始终使用小写 msg
和 model
,可以更容易地理解什么发生了什么。
考虑另一种更像 Haskellesque 的方法,其中类型参数通常缩写为 a
:
program :
{ init : (a, Cmd b)
, update : b -> a -> (a, Cmd b)
, subscriptions : a -> Sub b
, view : a -> Html b
} -> Program Never a b
该定义完全有效,但我认为它不像 program
的文档那样具有解释性,它提供了关于您的 Msg
和 [=12] 位置的强烈提示=]类型要走了。
我是 Elm 的初学者。这是关于风格的问题,而不是关于事物如何运作的问题。
例如,在http://elm-lang.org/examples/form中我们有
viewValidation : Model -> Html msg
我知道这样做是为了 viewValidation model
可以与 Html Msg
类型的值共存于同一个列表中。但是,既然这里的 msg
只是一个类型变量,为什么不用更传统的 a
呢?
msg
想要传达什么额外信息?
Elm 架构鼓励对 Model
和 Msg
等类型进行一致的命名,以传达它们的含义。使用小写 msg
只是让意图更清楚一些。
它很可能被命名为 a
,但可以说这并没有传达那么多信息。
编辑
要详细说明,请考虑 elm-lang/html
包的文档。
我们来看看Html.program
的定义:
program :
{ init : (model, Cmd msg)
, update : msg -> model -> (model, Cmd msg)
, subscriptions : model -> Sub msg
, view : model -> Html msg
} -> Program Never model msg
The Elm Architecture 非常清楚地概述了框架如何使用您的 Model
和 Msg
类型来承载状态并指示要执行的操作的意图。通过在整个文档中始终使用小写 msg
和 model
,可以更容易地理解什么发生了什么。
考虑另一种更像 Haskellesque 的方法,其中类型参数通常缩写为 a
:
program :
{ init : (a, Cmd b)
, update : b -> a -> (a, Cmd b)
, subscriptions : a -> Sub b
, view : a -> Html b
} -> Program Never a b
该定义完全有效,但我认为它不像 program
的文档那样具有解释性,它提供了关于您的 Msg
和 [=12] 位置的强烈提示=]类型要走了。