首页 > 解决方案 > Elm 语言中的“Program 是由三个类型变量参数化的类型:flags、model 和 msg”是什么意思?

问题描述

我正在学习榆树,通过费尔班克的“编程榆树”(https://pragprog.com/book/jfelm/programming-elm),并经历了与发布榆树做什么的人一样的成长痛苦“Program Never Model Msg”中的签名是什么意思?- @dogbert 的回复指出

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

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

因此

main: Program () {something: string} msg

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

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

《用 Elm 编程》这本书的好处是它能让你快速上手,但不太好的地方是它介绍了一些东西——就像上面所说的那样——没有详细说明什么,确切地说,他们的意思。我想我应该从阅读 elm 网站上的教程开始,这是我的下一个目的地。但这里的任何帮助将不胜感激。

标签: elm

解决方案


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

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

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

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

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

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

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

所以你可以有一个 type 的值List Stringor List Int

messages : List String
messages =
    ["Hello!", "Goodbye"]

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

同样,Program参数化以指定它接受的标志、模型和消息的类型。这样,Elm 编译器可以验证函数中给定的 等在view参数和返回类型方面的行为方式,并且 Elm 运行时可以确保它向您的程序传递正确的参数(例如标志)。updatemain

在此处阅读有关类型变量的更多信息。


推荐阅读