Warum benötigt Kotlin die Funktionssyntax?

8

Kotlin docs erklärte, dass es Funktionen höherer Ordnung unterstützt. Warum würde die Sprache sogar eine ::function -Syntax benötigen, wenn eine Funktion der obersten Ebene als Argument übergeben wird?

Gegeben:

%Vor%

Warum nicht einfach

%Vor%

Mehr zur Funktionssyntax hier .

    
Yudhistira Arya 13.04.2017, 15:39
quelle

2 Antworten

5

Kotlin Sprachdesign versucht, mehrdeutige Situationen zu vermeiden, in denen eine Abwesenheit von etwas sowohl korrekte als auch falsche Syntax zur gleichen Zeit sein könnte. Zum Beispiel, wenn Sie die vorgeschlagene Syntax erlaubt haben:

%Vor%

Das :: ist ein klares Signal für die Absicht. Aus diesem Grund erhalten Sie nur einen Fehler in der isOdd -Fall, weil Sie jetzt Möglichkeiten haben, die nicht überlappen:

%Vor%

Deshalb vermeidet Kotlin Dinge, die zu mehrdeutigen Zuständen führen. Ihre Augen können das Problem schnell aufgreifen, genauso wie die IDE und die statische Analyse, genauso wie der Compiler. Wenn Sie beginnen, diese lockere Syntax zuzulassen, werden Sie in kompoundierte Ambiguitäten geraten, etwa bei der Verwendung als Infix-Funktionen und so weiter. Sprachdesign ist komplizierter als "Oh, lassen Sie uns sie weniger Buchstaben eingeben", weil die Komplexitätsmatrix viel größer ist, als Sie sich vorstellen, wenn Sie nur einen Anwendungsfall betrachten und alle anderen ignorieren.

Warum die oben genannte Antwort falsch ist:

Die aktuell akzeptierte Antwort besagt, dass dies ein Namespace-Problem ist, das nicht korrekt ist. In diesem Beispiel verwenden sie:

%Vor%

Und behaupten, dass es wegen des Namespacings ohne die :: funktioniert. Es funktioniert tatsächlich, weil das bereits eine Funktionsreferenz ist und als Funktionsreferenz deklariert wurde und daher kein Operator benötigt wird, um es zu einer Funktionsreferenz . Die Funktion ist jedoch keine Referenz. Es ist eine Funktion. Es benötigt einen Operator :: , um es in einen Verweis auf die Funktion zu konvertieren, was erforderlich ist, wenn es als Prädikat für die Methode filter verwendet wird.

Die Behauptung in dieser Antwort ist irreführend und unwahr.

    
Jayson Minard 16.04.2017, 13:42
quelle
6
___ tag123kotlin ___ Kotlin ist eine Open-Source, statisch typisierte Programmiersprache, die von JetBrains unterstützt wird. Kotlin kombiniert OO- und Funktionsmerkmale und konzentriert sich auf Interoperabilität, Sicherheit, Übersichtlichkeit und Werkzeugunterstützung. Es zielt derzeit auf die JVM und JavaScript, und es ist eine offiziell unterstützte Sprache auf Android. ___ qstnhdr ___ Warum benötigt Kotlin die Funktionssyntax? ___ qstntxt ___

Kotlin docs erklärte, dass es Funktionen höherer Ordnung unterstützt. Warum würde die Sprache sogar eine :: -Syntax benötigen, wenn eine Funktion der obersten Ebene als Argument übergeben wird?

Gegeben:

%Vor%

Warum nicht einfach

%Vor%

Mehr zur Funktionssyntax hier .

    
___ answer43437882 ___

Kotlin Sprachdesign versucht, mehrdeutige Situationen zu vermeiden, in denen eine Abwesenheit von etwas sowohl korrekte als auch falsche Syntax zur gleichen Zeit sein könnte. Zum Beispiel, wenn Sie die vorgeschlagene Syntax erlaubt haben:

%Vor%

Das %code% ist ein klares Signal für die Absicht. Aus diesem Grund erhalten Sie nur einen Fehler in der %code% -Fall, weil Sie jetzt Möglichkeiten haben, die nicht überlappen:

%Vor%

Deshalb vermeidet Kotlin Dinge, die zu mehrdeutigen Zuständen führen. Ihre Augen können das Problem schnell aufgreifen, genauso wie die IDE und die statische Analyse, genauso wie der Compiler. Wenn Sie beginnen, diese lockere Syntax zuzulassen, werden Sie in kompoundierte Ambiguitäten geraten, etwa bei der Verwendung als Infix-Funktionen und so weiter. Sprachdesign ist komplizierter als "Oh, lassen Sie uns sie weniger Buchstaben eingeben", weil die Komplexitätsmatrix viel größer ist, als Sie sich vorstellen, wenn Sie nur einen Anwendungsfall betrachten und alle anderen ignorieren.

Warum die oben genannte Antwort falsch ist:

Die aktuell akzeptierte Antwort besagt, dass dies ein Namespace-Problem ist, das nicht korrekt ist. In diesem Beispiel verwenden sie:

%Vor%

Und behaupten, dass es wegen des Namespacings ohne die %code% funktioniert. Es funktioniert tatsächlich, weil das bereits eine Funktionsreferenz ist und als Funktionsreferenz deklariert wurde und daher kein Operator benötigt wird, um es zu einer Funktionsreferenz . Die Funktion ist jedoch keine Referenz. Es ist eine Funktion. Es benötigt einen Operator %code% , um es in einen Verweis auf die Funktion zu konvertieren, was erforderlich ist, wenn es als Prädikat für die Methode %code% verwendet wird.

Die Behauptung in dieser Antwort ist irreführend und unwahr.

    
___ antwort43399092 ___

Da Java (und daher Kotlin) separate Namespaces für Felder und Methoden verwendet, benötigen Sie %code% , um Mehrdeutigkeiten zu vermeiden. Beispiel:

%Vor%     
___
pdpi 13.04.2017 18:13
quelle

Tags und Links