elm - 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 网站上的教程开始,这是我的下一个目的地。但这里的任何帮助将不胜感激。
解决方案
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 的列表只能包含相同类型的元素。此类型被指定为 的参数a
,List
因此编译器可以验证我们不会在其中放入任何其他内容。
所以你可以有一个 type 的值List String
or List Int
:
messages : List String
messages =
["Hello!", "Goodbye"]
primes : List Int
primes =
[2, 3, 5, 7]
同样,Program
参数化以指定它接受的标志、模型和消息的类型。这样,Elm 编译器可以验证函数中给定的 等在view
参数和返回类型方面的行为方式,并且 Elm 运行时可以确保它向您的程序传递正确的参数(例如标志)。update
main
在此处阅读有关类型变量的更多信息。
推荐阅读
- asp.net-core - ASP.NET Core 控制器无法注册到授权包
- amazon-web-services - Terraform - 是否有管理启动配置中使用的 AMI 的最佳实践?
- javascript - 如何在 styled-components 中扩展组件样式
- enums - 如何在 OpenAPI 中定义枚举映射?
- python - 用分类列中的随机值填充缺失数据 - Python
- google-cloud-platform - 如何使用 Terraform 在云运行中添加 allUsers 成员
- python - 使用 Django 从 Flask 对用户进行身份验证
- r - 在绘图列表上使用 lines() 函数
- bootstrap-4 - bootstrap 4 data-trigger='focus' 不能在 div 上工作
- jquery - CSS 选择器:选项卡未保持选中状态