javascript - 理解 Elm 中的类型

标签 javascript types elm

尝试在 JS 背景和强类型和静态类型语言经验不足的情况下学习 Elm,我发现主要困难围绕类型语法(以及 Elm 通常对哪些类型有用)。不幸的是,我发现这些文档在这方面没有太大帮助。

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

type Msg = Increment | Decrement

将联合类型 Msg 定义为“存在”IncrementDecrement。这似乎表明 IncrementDecrement 也是类型。它们到底是什么? (它们没有在示例的其他地方定义,也不是预定义的类型)。

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

view 函数:

view model =
  div []
    [ button [ onClick Decrement ] [ text "-" ]
    , div [] [ text (toString model) ]
    , button [ onClick Increment ] [ text "+" ]
    ]

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

最佳答案

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

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

在这种特定情况下,您甚至可以将 Msg 视为 boolean 的奇特名称。

Sum 类型实际上很像 C 中的联合类型。不同之处在于,在 Elm 中它存储它是哪个选项。 Elm 从 Haskell 中汲取了这些概念。

关于javascript - 理解 Elm 中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39849071/

相关文章:

javascript - 在node.js中使用外部json到jade

c - 结构类型的完成是否对同一范围内该类型的所有先前声明有效?

c++ - 断言值文字没有类型是假的?

elm - 如何将行或列相对于另一个组件定位,同时与 Elm 的 mdgriffith/style-elements 保持对齐

elm - 如何在 Elm 中使用 SampleOn 合并两个信号

javascript - 在 JavaScript 中返回被破坏的参数

javascript - 下拉选择错误

javascript - 获取父级前一个div的属性值

scala - 为什么从案例类中提取时 Map 键类型不起作用?

python - 从 Elm 中的嵌套目录导入模块?