2017-02-23 6 views
6

私はエルムを学んでおり、その優雅さとシンプルさなど、魅力的なものがたくさん見つかります。しかし、私が困惑しているのは、文字列を連結するために "++"を使用することです。例: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 

タイプ変数numberおよびappendableは、すべてのElmタイプのサブセットを表すため、特殊です。 ListおよびStringappendableタイプであり、FloatおよびIntは数字タイプです。

理論的に代わりListStringFloatIntが含まれるであろうhasPlus型の変数を定義することは可能かもしれないが、多様関数を定義するとき、あなたはx + yy + xとは異なっている可能性があることを認識する必要があるだろう実際に数字について考えているのであれば、それはかなりの負担になるでしょう...

6

これは、オペレータの過負荷を避けるためです。

変数が使用されているときに型を静的に推論したり、可読性を向上させるのに役立つことがあります(文字列連結の場合++または+の場合は文字列連結)。

強く型付けされていない言語では(私はこれがELMの場合にはわかりませんが)、同じ表記法を使用すると、実際にプログラムを実行する前に変数で何が行われているのかを知ることができなくなります。もっとゆっくり。

XQueryでも+の代わりに||が使用されていますが、一部の言語でもCAMLの+.のように小数点以下の表記が異なります。

+0

あなたの答えをありがとう。それは確かに妥当と思われる。私はEvan CzaplickiまたはELMの内部動作に関わっている誰かからオンラインで決定的な回答を探していましたが、それを見つけることができませんでした。したがって、私の質問です。 –

+0

連結のために '+'をオーバーロードしない他のいくつかの主流言語はPHP( '.')とANSI SQL('|| 'を使用)です。 –

+1

@DaveSあなたが望むものがインサイダーからの答えであるならば、あなたはdevメーリングリストで尋ねるべきです。 –

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に、文字列は文字のHaskellのほうふつリストとして表されました。バージョン0.9では、新しい文字列ライブラリが導入されました(announcementを参照)ので、文字列がリストとして表示されなくても、演算子が永続化されたように見えます(++)。

+0

Elm Core Language Document - "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を持っている可能性があり、+関数は、2つの異なる意味を持つ多型であろうが、これが唯一にしても多くの魔法導入されるだろう言語。

+0

あなたの正しい、私は私の質問の最後の部分では正確ではありませんでした。つまり、私は自分の言語を連結から合計に切り替えました。私はそのエラーを修正しました。それを指摘してくれてありがとう。 –

+0

あなたは少し間違っています、接続があります。 (String、++)および(List、++)はモノイドであり、例えば、 (Int、+)はアーベルグループです。しかし、どのグループもモノイドです。しかし、Elmの場合には接続が弱すぎてIMOが役に立ちません。 –

+0

これは理由の一部ですが、[一般化されたリングに非可換的な追加を定義することは原則として可能です](https://en.wikipedia.org/wiki/Near-semiring)精度浮動小数点数は既に述べたとおりです)。同じように、連結の定義を一種の追加として一貫して定義できるいくつかの数学的形式があると確信しています。 –

関連する問題