【问题标题】:Understanding types in Elm理解 Elm 中的类型
【发布时间】:2017-02-12 10:17:50
【问题描述】:

在尝试学习 Elm 时,我有 JS 的背景,并且在强类型和静态类型语言方面经验很少,我发现主要的困难围绕着类型语法(以及通常在 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 的类型系统?

【问题讨论】:

  • 榆树指南在Union Types here上有更详细的讨论。
  • 我还注意到定义的联合类型Msg 在示例的其他地方没有使用。是否必须这样定义才能允许我们在update 函数中使用case 语句?
  • 您在其他任何地方都看不到 Msg,因为在此示例中没有注释其他函数(在 Elm 中它们没有必须,但可以对注释您的函数非常有帮助)。假设ModelInt的类型别名,那么类型注解应该是:view : model -> Html Msgupdate : Msg -> Model -> Model
  • 你的意思是view : Model -> Html Msg
  • 哎呀,是的,应该是大写的Model。 StackOverflow 现在不允许我更改它。接得好。它仍然会用小写字母编译,但它有不同的含义。注释中的小写表示大致上可以输入任何内容,但您通常会看到ab 之类的内容,如view : a -> Html Msg(按照惯例)

标签: javascript types elm


【解决方案1】:

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

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

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

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

【讨论】:

  • 我最近开始学习 Haskell,当我意识到 Elm 的大部分语法来自哪里时,我实际上是从偶然发现 Elm 开始学习 Haskell 的。我相信联合在 Haskell 中被称为代数数据类型?无论如何,我离题了-很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多