3

榆树官方网站上有一个init我不明白的函数定义:

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

所以init函数返回 a tuple,那么为什么不将其符号定义为:

init: (Model, Cmd Msg)

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

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

4

1 回答 1

7

是的,init是一个函数。()称为“单元”类型。它是一种只有一个值的类型,(),也称为“单元”。

现在我敢肯定你在问“嗯,这似乎毫无用处。拥有一个只能是一件事的函数参数有什么意义?”。答案是,如果你写一些通用的东西,可能需要一些东西,但并不总是必须这样做,这将非常有用。

在这种情况下,Browser.element指定init应该有 type flags -> ( model, Cmd msg ),其中flags是一个可以是任何东西的类型变量。由于Browser.elementflags以任何其他方式进行约束,因此您可以将其替换为您想要的任何内容,并且它仍然应该编译。

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

指南中更详细地解释了标志的工作原理

于 2019-03-10T15:11:28.460 回答