【问题标题】:What is `init : () -> (Model, Cmd Msg)` annotation?什么是`init : () -> (Model, Cmd Msg)`注解?
【发布时间】:2019-03-10 14:43:24
【问题描述】:

official Elm website 中有一个init 函数定义我不明白:

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

所以init 函数返回一个tuple,那为什么不将它的符号定义为:

init: (Model, Cmd Msg)

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

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

【问题讨论】:

    标签: types elm elm-architecture


    【解决方案1】:

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

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

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

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

    更详细地解释了标志的工作原理in the guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 2017-07-30
      • 1970-01-01
      • 2011-05-16
      • 2011-09-29
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多