为什么Elm使用'++'运算符来连接字符串?

时间:2017-02-23 13:05:34

标签: types syntax string-concatenation elm

我正在学习榆树,我发现很多有吸引力的东西,比如它的优雅和简洁。然而,我觉得令人费解的一个方面是使用“++”来连接字符串。例如:

> "hello" ++ " world"
"hello world"

添加按照您期望的方式工作。

> 2 + 3 + 9
14

大多数高级语言(如C#/ Java / JavaScript / Python)在串联字符串中使用单个加“+”,类似地将多个数字相加。它看起来更加直观,因为汇总字符串就像汇总数字一样具有一定的一致性。

有没有人知道在这种情况下使用++代替+的设计决策背后的逻辑?

2 个答案:

答案 0 :(得分:9)

Elm允许您定义多态函数。

参数多态是指函数可以应用于任何类型的元素:

f : (a, b) -> (b, a)
f (x, y) = (y, x)

Ad-hoc多态性是指函数可以应用于某些类型的元素:

g : appendable -> appendable -> appendable -> appendable
g x y z = x ++ y ++ z

h : number -> number -> number
h x y = (x + 2) * y

类型变量numberappendable是特殊的,因为它们代表所有Elm类型的子集。 ListString类型为appendable类型,FloatInt为数字类型。

理论上可以改为定义hasPlus类型变量,其中包括ListStringFloatInt,但在定义时一个多态函数,你需要知道x + y可能与y + x不同,如果你真的在考虑数字,这将是一个很大的负担......

答案 1 :(得分:6)

连接和添加是具有不同属性的完全不同的操作。例如,加法是可交换的(在整数上,浮点数是不同的野兽),而连接最绝对不是。通过某些语言重新使用运算符的任意决定是它们之间最强大的联系。

即使重载有意义,你也会遇到语言的静态特性 - 这类算子的类型应该是什么?

目前,运营商使用魔术类型number

(+) : number -> number -> number

虽然你可以拥有一个新的魔术类型numberorstring,而+函数将具有两种不同语义的多态性,但这只会在语言中引入更多魔法。