我正在学习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网站上的教程,这是我的下一个目的地。但这里的任何帮助将不胜感激。
答案 0 :(得分:9)
Program
是一种类型。这意味着我们可以拥有Program
类型的值,例如
main: Program () {something: String} msg
main =
Browser.sandbox { init = init, update = update, view = view }
在榆树中,main
不是函数。相反,它通常为运行时提供几个函数来调用:
init
,以传递任何标志并初始化模型。view
,并将模型作为参数传递,以生成要显示的HTML。update
。 update
返回一个新模型,运行时相应地更新其状态,然后调用view
来更新DOM。并非所有Elm程序都需要所有这些程序,并且可能还有其他程序(例如订阅),但是要点是,它没有运行程序时将调用的一个main
函数(在许多情况下,其他语言),Elm程序依靠Elm运行时来管理其生命周期。
现在将更多的参数(称为类型变量)设置为Program
类型。习惯Elm作为纯功能语言处理类型的方式需要花费一些时间。
也许List a
类型是一个更相关的示例。 Elm的列表只能包含相同类型的元素。此类型被指定为a
到List
的参数,因此编译器可以验证我们不会在其中放置任何其他内容。
因此您可以输入List String
或List Int
类型的值:
messages : List String
messages =
["Hello!", "Goodbye"]
primes : List Int
primes =
[2, 3, 5, 7]
以同样的方式,对Program
进行参数化以指定其接受的标志,模型和消息的类型。这样,Elm编译器可以验证view
函数中给定的update
,main
等,在参数和返回类型以及Elm运行时方面的行为可以确保它为您的程序传递了正确的参数(例如标志)。
详细了解类型变量here。