在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)
?例如,我可以说从任何东西返回一个元组?
是的,init
是一个功能。 ()
被称为“单位”类型。这是一种只有一个值的类型,()
,也称为“单位”。
现在我确定你会问“嗯,这看起来很无用。有一个函数参数只能是一件事有什么意义?”。答案是,如果你写一些可能需要的东西,但并不总是必须这样做,那将非常有用。
在这种情况下,Browser.element
指定init
应该具有类型flags -> ( model, Cmd msg )
,其中flags
是一个类型变量,可以是任何东西。由于Browser.element
不以任何其他方式约束flags
,你可以用你想要的任何东西替换它,它仍然应该编译。
但请注意,Browser.element
有点神奇。在运行时,Elm将查看您分配给flags
的类型,并希望您从JavaScript传递该类型的值。如果不这样做,这是Elm在运行时失败的极少数情况之一(尽管从技术上讲,它会在任何Elm代码运行之前失败,因为你在JavaScript端犯了错误)。在这里指定()
意味着你没有期待任何标志。
in the guide更详细地解释了标志的工作原理