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

时间:2019-03-10 14:43:25

标签: types elm elm-architecture

official Elm website中有一个我不理解的cat函数定义:

sns.catplot(x="borough", y="pickups", col='cat', hue="borough", kind='bar', sharey=False, data=comb_df, size=4, aspect=1)
plt.legend()
plt.show()

所以sharey=False函数返回一个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?例如,我可以说从任何东西返回元组吗?

1 个答案:

答案 0 :(得分:7)

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

现在,我确定您正在问“看起来似乎毫无用处。拥有只能是一件事的函数参数有什么意义?”。答案是,如果您编写的某些可能需要但不一定总是需要的东西,这将非常有用。

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

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

更详细地说明了标记的工作原理in the guide