Większość języków programowania (zarówno języki dynamiczne, jak i statyczne) mają specjalne słowa kluczowe i / lub składnię, która wygląda znacznie inaczej niż deklarowanie zmiennych dla deklaracji funkcji. Widzę funkcje tak samo, jak deklarowanie innego nazwanego bytu:
Na przykład w Pythonie:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
Dlaczego nie:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
Podobnie w języku takim jak Java:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
Dlaczego nie:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
Ta składnia wydaje się bardziej naturalnym sposobem deklarowania czegoś (czy to funkcji, czy zmiennej) i jednego mniej słowa kluczowego, takiego jak def
lub function
w niektórych językach. I, IMO, jest bardziej spójny (szukam w tym samym miejscu, aby zrozumieć typ zmiennej lub funkcji) i prawdopodobnie sprawia, że parser / gramatyka jest nieco prostsza do napisania.
Wiem, że bardzo niewiele języków korzysta z tego pomysłu (CoffeeScript, Haskell), ale większość popularnych języków ma specjalną składnię dla funkcji (Java, C ++, Python, JavaScript, C #, PHP, Ruby).
Nawet w Scali, która obsługuje oba sposoby (i ma wnioskowanie o typie), bardziej powszechne jest pisanie:
def addOne(x: Int) = x + 1
Zamiast:
val addOne = (x: Int) => x + 1
IMO, przynajmniej w Scali, jest to prawdopodobnie najłatwiejsza do zrozumienia wersja, ale ten idiom jest rzadko stosowany:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
Pracuję nad własnym językiem zabawek i zastanawiam się, czy są jakieś pułapki, jeśli zaprojektuję taki język w taki sposób i czy istnieją jakieś przyczyny historyczne lub techniczne, że ten wzór nie jest powszechnie stosowany?
(int => int) addOne = (x) => {
jest o wiele bardziej „specjalny” i „złożony” niż int addOne(int) {
...