2017-02-23 89 views
6

我正在學習Elm,我發現很多有吸引力的東西,比如它的優雅和簡單。然而,我發現令人費解的一個方面是它使用「++」連接字符串。例如:爲什麼Elm使用'++'運算符連接字符串?

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

加法按您期望的方式工作。

> 2 + 3 + 9 
14 

大多數的高級語言如C#/的Java/JavaScript的/ Python中使用一個單一的加號「+」在類似的方式多個號碼將被總結連接字符串。它看起來更加直觀,因爲連接字符串如求和數字具有一定的一致性。

有沒有人知道設計決定背後的邏輯在這種情況下使用++而不是+?

回答

9

Elm允許您定義多態函數。

參數多態是當一個函數可以被應用於任何類型的元素:

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

特設多態性是當一個函數可以適用於某些類型的元素:

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

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

類型變量numberappendable是特殊的,因爲它們表示所有Elm類型的子集。 ListStringappendable類型,而FloatInt是數字類型。

這在理論上是可能的,而不是定義hasPlus類型的變量,其中將包括ListStringFloatInt,但隨後定義一個多態的功能,當你需要知道它是可能的,x + yy + x不同如果你真的在考慮數字,這將是一個很大的負擔......

6

這可能是爲了避免超載操作員。

當使用變量時,靜態地推斷類型甚至提高可讀性可能很有用,因爲它清楚正在做什麼(字符串連接如果++或算術如果+)。

在沒有強類型的語言中(我不知道ELM是否屬於這種情況),使用相同的表示法可能會導致在實際運行程序之前無法知道變量是如何完成的,這使得它比較慢。

XQuery使用||而不是+,有些語言甚至對小數使用不同的符號,如CAML中的+.

+0

感謝您的回答。這聽起來似乎合理。我一直在尋找Evan Czaplicki或ELM內部工作人員的一個明確答案,但無法找到答案。因此我的問題。 –

+0

一些其他不會重載'+'進行連接的主流語言是PHP(使用'.')和ANSI SQL(使用'||')。 –

+1

@DaveS如果你想要的是內部人員的答案,你應該在開發郵件列表中詢問。 –

4

按照docs,該++運算符用於追加列表:

-- alias for appending lists and two lists 
append xs ys = xs ++ ys 
xs = [1,2,3] 
ys = [4,5,6] 

-- All of the following expressions are equivalent: 
a1 = append xs ys 
a2 = xs ++ ys 

b2 = (++) xs ys 

c1 = (append xs) ys 
c2 = ((++) xs) ys 

此前0.9版本,絲線表示字符的哈斯克爾啓發列表。版本0.9引入了一個新的字符串庫(請參閱announcement這裏),所以它看起來像++運算符持續存在,儘管字符串不再被表示爲列表。

+0

來自Elm核心語言文檔 - 「Elm使用(++)運算符將字符串放在一起,注意兩個字符串保持完全一樣,因此當我們結合」hello「和」world「時,結果沒有空間。」你說的可能很好。我希望看到明確的答案。我到目前爲止還沒有找到一個,因此我的問題。 –

+0

++僅限於追加列表和字符串? –

+0

[顯然如此](http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Basics#++)。 – CodeMacabre

5

連接和加法是完全不同的屬性操作。例如,加法是可交換的(在整數上,浮點數是不同的),而連接最明顯的不是。通過某些語言重複使用操作符的任意決定是它們之間最強的連接,你可以找到。

即使重載是有意義的,你也會觸及該語言的靜態特性 - 這種操作符的類型應該是什麼?

目前的操作符對魔法類number

(+) : number -> number -> number 

雖然你可以有一個新的魔法型numberorstring+功能將是多態的兩個不同的語義,這隻會引入更多的幻成語言。

+0

您的正確,我在我的問題的最後部分不精確;即我將我的語言從連接轉換爲求和。我修復了這個錯誤。感謝您指出。 –

+0

你有點不對,有一個連接。 (String,++)和(List,++)是monoid,而(Int,+)是一個阿貝爾組。但是任何一個組也都是幺半羣。但是,IMO的這種聯繫太過薄弱,無法用於榆樹。 –

+0

我想這是原因的一部分,[原則上可以在廣義環上定義非交換加法](https://en.wikipedia.org/wiki/Near-semiring)(不要說有限 - 精確的浮點數,你已經提到過)。同樣,我確信有一些數學形式主義可以讓我們一致地將連接定義爲一種加法。 –

相關問題