"Program is a type parameterized by three type variables: flags, model, and msg" 在 Elm 语言中是什么意思?

What does "Program is a type parameterized by three type variables: flags, model, and msg" mean in the Elm language?

我正在学习 Elm,通过 Fairbank 的"Programming Elm"(https://pragprog.com/book/jfelm/programming-elm), and going through some of the same growing pains as the person who posted ——@dogbert 的回复指出

Program is a type parameterized by three type variables

这到底是什么意思?是不是说Program是一个函数,它的参数的类型就是三个类型变量?

因此

main: Program () {something: string} msg

Program 只接受空标志、具有给定类型的模型和消息?

(顺便说一句,在这种情况下,main的类型是什么?也就是说,它是Program类型的函数?)

这本书的好处 "Programming with Elm" 是它可以让你快速入门,但不是很好的地方是它介绍了一些东西 - 就像上面 - 没有深入细节关于什么,确切地,他们的意思。我想我真的应该从阅读 elm 站点上的教程开始,这是我的下一个目的地。但如有任何帮助,我们将不胜感激。

Program 是一种类型。这意味着我们可以拥有 Program 类型的值,例如

main: Program () {something: String} msg
main =
    Browser.sandbox { init = init, update = update, view = view }

在 Elm 中,main 不是函数。相反,它通常提供几个函数供运行时调用:

  • 首先,运行时调用 init,传入任何标志并初始化模型。
  • 然后调用 view,将模型作为参数传递,生成 HTML 进行显示。
  • 每当您的程序需要对某事做出反应(例如按钮单击等事件)时,运行时都会使用当前模型调用 update 并显示一条消息指示发生了什么。 update return 一个新模型,运行时相应地更新其状态,然后调用 view 更新 DOM。

并不是所有的 Elm 程序都需要所有这些,可能还有其他的(比如订阅),但要点是,而不是让一个 main 函数在你的程序运行时调用(如在许多其他语言中),Elm 程序依赖于 Elm 运行时来管理它们的生命周期。

现在更多关于 Program 类型的参数(称为 类型变量 )。需要一些时间来习惯 Elm 作为一种纯函数式语言处理类型的方式。

也许 List a 类型是一个更相关的例子。 Elm 的列表只能包含相同类型的元素。此类型被指定为 aList 的参数,因此编译器可以验证我们不会在其中放置任何其他内容。

所以你可以有一个 List StringList Int:

类型的值
messages : List String
messages =
    ["Hello!", "Goodbye"]

primes : List Int
primes =
    [2, 3, 5, 7]

同样,Program 被参数化以指定它接受的标志、模型和消息的种类。这样,Elm 编译器可以验证 viewupdate 等在 main 函数中给出的关于它们的参数和 return 类型的行为方式, Elm 运行时可以确保它向您的程序传递正确的参数(例如标志)。

阅读有关类型变量的更多信息 here