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

Types 什么是'init:()->;(Model,Cmd Msg)`注释?,types,elm,elm-architecture,Types,Elm,Elm Architecture,其中有一个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

其中有一个
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
返回一个返回元组的函数。这是真的吗


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

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

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

在这种情况下,
Browser.element
指定
init
应具有类型
flags->(model,Cmd msg)
,其中
flags
是一个类型变量,可以是任何类型。由于
Browser.element
不以任何其他方式约束
标志
,因此您可以将其替换为所需的任何内容,并且它仍应编译

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

将更详细地解释标志的工作原理