尝试学习具有JS背景知识的Elm以及在强类型和静态类型语言方面的经验,我发现主要的难点在于类型语法(以及在Elm中通常使用哪些类型)。不幸的是,我发现这些文档在这方面没有多大帮助。
如果我在这里采用简单示例:http://elm-lang.org/examples/buttons,行:
type Msg = Increment | Decrement
将联合类型Msg
定义为“正在”Increment
或Decrement
。它似乎表明Increment
和Decrement
也是类型。它们究竟是什么? (它们未在示例中的其他位置定义,也不是预定义类型)。
然后,它们在view
函数中用作onClick
的参数。现在,它们似乎就像一种“信息”(无论那意味着什么)。在JS中,这可能是通过在每种情况下为(可变)变量赋值来实现的 - 当然这不是Elm方式。那么,类型的工作方式是否与不变性主题相关?
view
功能:
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, div [] [ text (toString model) ]
, button [ onClick Increment ] [ text "+" ]
]
我认为这可能会打开一个更广泛的主题(如果有人可以指向有用的链接,谢谢!)但我的问题是:Increment
和Decrement
在这里是什么?它们如何适合Elm的类型系统?
答案 0 :(得分:3)
Decrement
和Msg
是数据构造函数。您可以将它们视为OO构造函数,它们可以具有参数,更重要的是,可以区分它们。
你是对的,他们确实是一个信息;但由于它们没有参数,因此它们与枚举值没有区别。值不可变的事实与它几乎没有关系。 C / C ++ / Java也支持枚举。
在这种特定情况下,您甚至可以将boolean
视为namespace(lib.FormTagLib).with {
entry(title: _("Name"), field:"name") {
textbox( default:"label")
}
block{
entry(field:"seleniumCapabilities") {
hetero_list( name: "seleniumCapabilities",
hasHeader: true,
descriptors:descriptor.axisItemTypes(),
items: instance?
instance.getSeleniumCapabilities():
descriptor.loadDefaultItems())
}
}
}
的精彩名称。
Sum类型实际上大多数类似于C中的联合类型。区别在于它在Elm中存储了它的哪个选项。 Elm从Haskell中获取这些概念。