Elm语言中的“程序是由三个类型变量参数化的类型:标志,模型和msg”表示什么?

时间:2019-11-05 12:17:23

标签: elm

我正在学习Elm,方法是阅读Fairbank(https://pragprog.com/book/jfelm/programming-elm)的“ Programming Elm”,并经历与发布what does the elm signature mean in "Program Never Model Msg"?的人相同的成长烦恼-那里的回复@dogbert指出

  

程序是由三个类型变量参数化的类型

那到底是什么意思?这是否意味着Program是一个函数,并且其参数的类型是三个类型变量?

因此

main: Program () {something: string} msg

Program仅接受空标志,具有给定类型的模型和msg?

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

“榆树编程”这本书的好处是它可以让您快速起步,但不是那么重要的是它引入了一些内容(例如上述内容),而没有详细介绍什么,确切地说,它们的意思是。我想我真的应该先阅读Elm网站上的教程,这是我的下一个目的地。但这里的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:9)

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

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

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

  • 首先,运行时调用init,以传递任何标志并初始化模型。
  • 然后它调用view,并将模型作为参数传递,以生成要显示的HTML。
  • 无论何时您的程序需要对某些事情做出反应(例如,单击按钮之类的事件),运行时都会使用当前模型和一条指示发生了什么的消息来调用updateupdate返回一个新模型,运行时相应地更新其状态,然后调用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编译器可以验证view函数中给定的updatemain等,在参数和返回类型以及Elm运行时方面的行为可以确保它为您的程序传递了正确的参数(例如标志)。

详细了解类型变量here