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方面犯了错误)。在这里指定()
意味着您不需要任何标志
将更详细地解释标志的工作原理