什么是`init:()->(Model,Cmd Msg)`注释?

3 types elm elm-architecture

Elm官方网站上有一个init我不理解的函数定义:

init : () -> (Model, Cmd Msg)
init _ =
  ( Loading
  , Http.get
      { url = "https://elm-lang.org/assets/public-opinion.txt"
      , expect = Http.expectString GotText
      }
  )
Run Code Online (Sandbox Code Playgroud)

因此,init函数返回一个tuple,然后为什么不将其符号定义为:

init: (Model, Cmd Msg)
Run Code Online (Sandbox Code Playgroud)

但是在他们的示例中init返回的函数返回一个tuple。这是真的?

以及如何阅读()init : () -> (Model, Cmd Msg)?例如,我可以说从任何东西返回元组吗?

gle*_*nsl 7

是的,init是一个功能。()称为“单位”类型。这种类型只有一个值,()也称为“单位”。

现在,我确定您在问“看起来似乎毫无用处。拥有只能是一件事的函数参数有什么意义?”。答案是,如果您编写泛型的东西可能会花点时间,但不必总是这样做,这将非常有用。

在这种情况下,Browser.element指定init应该具有type flags -> ( model, Cmd msg ),其中flagstype变量可以是任何值。由于Browser.element没有flags任何其他限制,因此您可以将其替换为所需的任何内容,并且仍然可以编译。

但是请注意,Browser.element这有点不可思议。在运行时,Elm将查看分配给您的类型,flags并期望您从JavaScript向其传递该类型的值。如果不这样做,这是Elm在运行时失败的极少数实例之一(尽管从技术上讲,它会在任何Elm代码运行之前失败,因为您在JavaScript方面犯了一个错误)。()在此处指定意味着您不希望有任何标志。

指南中对标志的工作方式进行了详细说明