了解榆树中的类型

Nic*_*uin 5 javascript types elm

尝试学习具有JS背景知识的Elm以及在强类型和静态类型语言方面的经验,我发现主要的难点在于类型语法(以及通常用于Elm的类型).不幸的是,我发现这些文档在这方面非常有用.

如果我在这里采用简单的例子:http://elm-lang.org/examples/buttons,行:

type Msg = Increment | Decrement
Run Code Online (Sandbox Code Playgroud)

将联合类型定义Msg为"正在" Increment或者Decrement.这似乎表明,IncrementDecrement是类型了.它们究竟是什么?(它们未在示例中的其他位置定义,也不是预定义类型).

然后,它们在view函数中用作参数onClick.现在,它们似乎就像一种"信息"(无论那意味着什么).在JS中,这可能是通过在每种情况下为(可变)变量赋值来实现的 - 当然这不是Elm方式.那么,类型的工作方式是否与不变性主题相关?

view函数:

view model =
  div []
    [ button [ onClick Decrement ] [ text "-" ]
    , div [] [ text (toString model) ]
    , button [ onClick Increment ] [ text "+" ]
    ]
Run Code Online (Sandbox Code Playgroud)

我想,这可能会打开一个更广阔的主题(如果有人可以指向有用的链接,谢谢!),但我的问题是:什么是IncrementDecrement这里?它们如何适合Elm的类型系统?

Jan*_*jse 3

IncrementDecrement是数据构造器。您可以将它们视为 OO 构造函数,它们可以有参数,更重要的是,可以区分它们。

你是对的,它们确实是一条消息;但由于它们没有参数,因此与枚举值没有什么不同。值不可变这一事实与此无关。C/C++/Java 也支持枚举。

在这种特定情况下,您甚至可以Msgboolean.

Sum 类型实际上与 C 中的 union 类型非常相似。不同之处在于,在 Elm 中它存储的是哪个选项。Elm 从 Haskell 继承了这些概念。