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

问题描述 投票:3回答:1

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个回答
7
投票

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

现在我确定你会问“嗯,这看起来很无用。有一个函数参数只能是一件事有什么意义?”。答案是,如果你写一些可能需要的东西,但并不总是必须这样做,那将非常有用。

在这种情况下,Browser.element指定init应该具有类型flags -> ( model, Cmd msg ),其中flags是一个类型变量,可以是任何东西。由于Browser.element不以任何其他方式约束flags,你可以用你想要的任何东西替换它,它仍然应该编译。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.