Elm中“ HTML msg”中的“ msg”实际上是什么?

Cer*_*ean 4 parametric-polymorphism elm

我正在自学榆木,并且看到(当然)有很多关于Html msg-

我知道这是一个“参数化类型”,也就是说,(据我所知),该类型的构造函数Html需要一个参数- 与之类似List Char

好。但是随后在一些教程中,我看到他们迅速将其更改msg为自定义类型,通常是这样的(我是从内存中这样做的,所以请原谅我):

Html Msg
Run Code Online (Sandbox Code Playgroud)

在哪里Msg可以定义为

type Msg =
  Something | SomethingElse
Run Code Online (Sandbox Code Playgroud)

我还在这里看到-https: //discourse.elm-lang.org/t/html-msg-vs-html-msg/2758-他们说

小写的味精称为类型变量。大写的Msg称为具体类型-您的应用程序已定义的类型。

那部分地回答了我的问题,但是有人可以详细说明这到底意味着什么吗?因为当我看到类似的内容时List String,我了解了String这种情况下的msg含义,但是却不了解含义Html msg

另外,我们是否不更改函数返回值的类型?也就是说,如果Elm运行时期望view返回某个类型,并且该类型为Html msg,如果我们将返回类型更改为Html Whatever,为什么这样做有效?(例如,我们不能在函数的返回值从List StringList Number随意,对吧?)

来自OOP的背景以及诸如C,TypeScript等类型语言的背景,我认为任何东西Msg都需要以某种方式与关联msg,即以某种方式“扩展”它以允许多态。显然,我在看这种错误的方式,任何解释都将不胜感激!

gle*_*nsl 7

TL;博士:只要每个功能上一致的类型msg,并且model,它们可以是你想要的任何东西。

就像的type参数一样Listmsg可以是任何值。没有限制。为了演示,这是经典的增减示例,msg只是一个Int

-- These type aliases aren't needed, but makes it easier to distinguish
-- their roles in later type signatures
type alias Model = Int
type alias Msg = Int


update : Msg -> Model -> Model
update msg model =
    model + msg


view : Model -> Html Msg
view model =
    div []
        [ button [ onClick 1 ] [ text "+1" ]
        , div [] [ text <| String.fromInt model.count ]
        , button [ onClick (-1) ] [ text "-1" ]
        ]


main : Program () Model Msg
main =
    Browser.sandbox { init = 0, view = view, update = update }
Run Code Online (Sandbox Code Playgroud)

那如何运作?关键在Browser.sandbox函数中,因为这就是将所有内容连接在一起的原因。其类型签名为:

sandbox :
    { init : model
    , view : model -> Html msg
    , update : msg -> model -> model
    }
    -> Program () model msg
Run Code Online (Sandbox Code Playgroud)

其中modelmsg是类型变量。这两个可与任何具体的类型,只要它与这个签名,这是他们必须要跨越同一给定的约束相匹配更换,initviewupdate功能。否则,我们将在此处收到类型错误。例如,如果update需要使用String而不是Int,则会收到错误消息:

This argument is a record of type:

    { init : Model, update : String -> Model -> Model, view : Model -> Html Msg
    }

But `sandbox` needs the 1st argument to be:

    { init : Model
    , update : String -> Model -> Model
    , view : Model -> Html String
    }
Run Code Online (Sandbox Code Playgroud)

当然,实际上并不清楚是对还是错,只是存在不匹配。但是为了提供帮助,它假定String是正确的,并期望view返回Html String

我希望能充分回答您的问题。如果没有,请评论并订阅!

  • 你不知道。您可以编写处理任何类型的“msg”的函数。毕竟,这就是“Browser.sandbox”的作用。它只是传递值,就像一个可以容纳任何东西的盒子。您也不需要使用带有“view”和“update”的具体类型,但这当然不会是一个非常有用的应用程序。它将是完全静态的。 (2认同)