【发布时间】:2017-02-12 10:17:50
【问题描述】:
在尝试学习 Elm 时,我有 JS 的背景,并且在强类型和静态类型语言方面经验很少,我发现主要的困难围绕着类型语法(以及通常在 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 的类型系统?
【问题讨论】:
-
榆树指南在Union Types here上有更详细的讨论。
-
我还注意到定义的联合类型
Msg在示例的其他地方没有使用。是否必须这样定义才能允许我们在update函数中使用case语句? -
您在其他任何地方都看不到
Msg,因为在此示例中没有注释其他函数(在 Elm 中它们没有必须,但可以对注释您的函数非常有帮助)。假设Model是Int的类型别名,那么类型注解应该是:view : model -> Html Msg和update : Msg -> Model -> Model -
你的意思是
view : Model -> Html Msg? -
哎呀,是的,应该是大写的
Model。 StackOverflow 现在不允许我更改它。接得好。它仍然会用小写字母编译,但它有不同的含义。注释中的小写表示大致上可以输入任何内容,但您通常会看到a或b之类的内容,如view : a -> Html Msg(按照惯例)
标签: javascript types elm