我正在学习榆树,我发现很多有吸引力的东西,比如它的优雅和简洁。然而,我觉得令人费解的一个方面是使用“++”来连接字符串。例如:
> "hello" ++ " world"
"hello world"
添加按照您期望的方式工作。
> 2 + 3 + 9
14
大多数高级语言(如C#/ Java / JavaScript / Python)在串联字符串中使用单个加“+”,类似地将多个数字相加。它看起来更加直观,因为汇总字符串就像汇总数字一样具有一定的一致性。
有没有人知道在这种情况下使用++代替+的设计决策背后的逻辑?
答案 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
类型变量number
和appendable
是特殊的,因为它们代表所有Elm类型的子集。 List
和String
类型为appendable
类型,Float
和Int
为数字类型。
理论上可以改为定义hasPlus
类型变量,其中包括List
,String
,Float
和Int
,但在定义时一个多态函数,你需要知道x + y
可能与y + x
不同,如果你真的在考虑数字,这将是一个很大的负担......
答案 1 :(得分:6)
连接和添加是具有不同属性的完全不同的操作。例如,加法是可交换的(在整数上,浮点数是不同的野兽),而连接最绝对不是。通过某些语言重新使用运算符的任意决定是它们之间最强大的联系。
即使重载有意义,你也会遇到语言的静态特性 - 这类算子的类型应该是什么?
目前,运营商使用魔术类型number
:
(+) : number -> number -> number
虽然你可以拥有一个新的魔术类型numberorstring
,而+
函数将具有两种不同语义的多态性,但这只会在语言中引入更多魔法。