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

Dav*_*e S 7 syntax types string-concatenation elm

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

> "hello" ++ " world"
"hello world"
Run Code Online (Sandbox Code Playgroud)

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

> 2 + 3 + 9
14
Run Code Online (Sandbox Code Playgroud)

大多数高级语言(如C#/ Java/JavaScript/Python)在串联字符串中使用单个加"+",类似地将多个数字相加.它看起来更加直观,因为在连接字符串中存在一定的一致性,如求和数.

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

Zim*_*i48 9

Elm允许您定义多态函数.

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

f : (a, b) -> (b, a)
f (x, y) = (y, x)
Run Code Online (Sandbox Code Playgroud)

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

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

h : number -> number -> number
h x y = (x + 2) * y
Run Code Online (Sandbox Code Playgroud)

该类型变量numberappendable,因为他们代表了所有榆树类型的子集是特殊的.List并且Stringappendable类型while FloatInt是数字类型.

这在理论上是可能的,而不是定义一个hasPlus变量类型,其中将包括List,String,FloatInt,但随后定义一个多态的功能,当你需要知道它是可能的,x + y比不同y + x,如果你实际上这是个很大的负担思考数字......


Ghi*_*rny 6

这可能是为了避免操作员过载.

在使用变量时静态推断类型甚至提高可读性可能很有用,因为它可以清楚地完成了什么(如果是字符串连接++或者是算术符号+).

在非强类型语言中(我不知道Elm中是否存在这种情况),使用相同的表示法会使得在实际运行程序之前无法知道对变量执行了什么操作,这会使其变慢.

XQuery使用||而不是+,有些语言甚至使用不同的小数表示法,如+.CAML.


Jan*_*nar 6

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

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

目前,运营商在魔术类型上工作number:

(+) : number -> number -> number
Run Code Online (Sandbox Code Playgroud)

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