理解 Elm 中的类型
Understanding types in Elm
尝试在 JS 背景和强类型和静态类型语言经验不足的情况下学习 Elm,我发现主要困难围绕类型语法(以及 Elm 通常有哪些类型有用)。不幸的是,我发现文档在这方面没有太大帮助。
如果我在这里举个简单的例子:http://elm-lang.org/examples/buttons,行:
type Msg = Increment | Decrement
将联合类型 Msg
定义为 "being" Increment
或 Decrement
。似乎表明 Increment
和 Decrement
也是类型。它们到底是什么? (它们没有在示例的其他地方定义,也不是预定义的类型)。
然后,它们在view
函数中用作onClick
的参数。现在,它们的行为似乎有点像 "message"(不管那是什么意思)。在 JS 中,这可能会通过在每种情况下为(可变)变量赋值来实现——这当然不是 Elm 的方式。那么,类型的工作方式是否与不变性主题相关?
view
函数:
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, div [] [ text (toString model) ]
, button [ onClick Increment ] [ text "+" ]
]
我认为这可能会打开一个更广泛的话题(如果有人可以指向有用的链接,谢谢!)但我的问题是:这里的 Increment
和 Decrement
是什么?它们如何适应 Elm 的类型系统?
Increment
和 Decrement
是数据构造函数。您可以将它们视为 OO 构造函数,它们可以具有参数,更重要的是,可以区分它们。
你是对的,它们确实是一条消息;但由于它们没有参数,因此它们与枚举值没有区别。值是不可变的事实与它无关。 C/C++/Java也支持枚举。
在这种特定情况下,您甚至可以将 Msg
视为 boolean
.
的奇特名称
Sum 类型实际上大部分类似于 C 中的联合类型。不同之处在于,在 Elm 中它存储它是哪个选项。 Elm 从 Haskell.
中获取这些概念
尝试在 JS 背景和强类型和静态类型语言经验不足的情况下学习 Elm,我发现主要困难围绕类型语法(以及 Elm 通常有哪些类型有用)。不幸的是,我发现文档在这方面没有太大帮助。
如果我在这里举个简单的例子:http://elm-lang.org/examples/buttons,行:
type Msg = Increment | Decrement
将联合类型 Msg
定义为 "being" Increment
或 Decrement
。似乎表明 Increment
和 Decrement
也是类型。它们到底是什么? (它们没有在示例的其他地方定义,也不是预定义的类型)。
然后,它们在view
函数中用作onClick
的参数。现在,它们的行为似乎有点像 "message"(不管那是什么意思)。在 JS 中,这可能会通过在每种情况下为(可变)变量赋值来实现——这当然不是 Elm 的方式。那么,类型的工作方式是否与不变性主题相关?
view
函数:
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, div [] [ text (toString model) ]
, button [ onClick Increment ] [ text "+" ]
]
我认为这可能会打开一个更广泛的话题(如果有人可以指向有用的链接,谢谢!)但我的问题是:这里的 Increment
和 Decrement
是什么?它们如何适应 Elm 的类型系统?
Increment
和 Decrement
是数据构造函数。您可以将它们视为 OO 构造函数,它们可以具有参数,更重要的是,可以区分它们。
你是对的,它们确实是一条消息;但由于它们没有参数,因此它们与枚举值没有区别。值是不可变的事实与它无关。 C/C++/Java也支持枚举。
在这种特定情况下,您甚至可以将 Msg
视为 boolean
.
Sum 类型实际上大部分类似于 C 中的联合类型。不同之处在于,在 Elm 中它存储它是哪个选项。 Elm 从 Haskell.
中获取这些概念