ほとんどのプログラミング言語(動的および静的に型付けされた言語の両方)には、関数を宣言するための変数の宣言とは大きく異なる特別なキーワードおよび/または構文があります。関数は別の名前付きエンティティを宣言するのと同じように見えます:
たとえば、Pythonの場合:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
何故なの:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
同様に、Javaのような言語では:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
何故なの:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
この構文は、何か(関数または変数)を宣言するより自然な方法であり、一部の言語のように、def
またはfunction
いくつかの言語でキーワードを1つ少なくします。そして、IMO、それはより一貫性があり(変数または関数の型を理解するために同じ場所を見る)、おそらくパーサー/文法を書くことを少し簡単にします。
このアイデアを使用する言語はほとんどありませんが(CoffeeScript、Haskell)、ほとんどの一般的な言語には関数(Java、C ++、Python、JavaScript、C#、PHP、Ruby)の特別な構文があります。
両方の方法をサポートする(および型推論を行う)Scalaでも、次のように記述するのが一般的です。
def addOne(x: Int) = x + 1
のではなく:
val addOne = (x: Int) => x + 1
IMO、少なくともScalaで、これはおそらく最も簡単に理解できるバージョンですが、このイディオムはめったに続きません:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
私は自分のおもちゃの言語に取り組んでいますが、そのような方法で言語を設計する場合に落とし穴があり、歴史的または技術的な理由がこのパターンに従っていない場合は疑問がありますか?
(int => int) addOne = (x) => {
多くの「特別」と「複雑」よりint addOne(int) {
...