Scala while (true) Typ stimmt nicht überein? Unendliche Schleife in Scala?

7

Warum folgender Code

%Vor%

erzeugt folgenden Compilerfehler

%Vor%

?

Das funktioniert in C # gut. Die while-Schleife wird für immer ausgeführt, sodass sie nicht beendet werden kann. Daher kann sie nicht zu etwas anderem als string führen. Oder wie man eine Endlosschleife in Scala macht?

    
TN. 29.05.2012, 16:15
quelle

6 Antworten

1

Basiert auf senia , Elbogenich und dave habe ich folgende Lösungen verwendet:

%Vor%

Welches kann dann als elbowich und dave's Lösungen verwendet werden:

%Vor%     
TN. 30.05.2012, 08:32
quelle
16

Im Gegensatz zu C # (und Java und C und C ++), bei denen es sich um auf Anweisungen basierende Sprachen handelt, ist Scala eine ausdrucksbasierte Sprache. Das ist meistens ein großes Plus in Sachen Zusammensetzbarkeit und Lesbarkeit, aber in diesem Fall hat dich der Unterschied gebissen.

Eine Scala-Methode gibt implizit den Wert des letzten Ausdrucks in der Methode

zurück %Vor%

In Scala ist so ziemlich alles ein Ausdruck. Dinge, die wie Anweisungen aussehen, sind immer noch Ausdrücke, die einen Wert eines Typs namens Unit zurückgeben. Der Wert kann als () geschrieben werden.

%Vor%

Kein Compiler für eine Turing-äquivalente Sprache kann alle nicht-terminierenden Schleifen erkennen (vgl. Turing-Halteproblem), so dass die meisten Compiler nur sehr wenig arbeiten, um solche zu erkennen. In diesem Fall ist der Typ von "while (someCondition) {...}" Unit egal was someCondition ist, auch wenn es die Konstante true ist.

%Vor%

Scala stellt fest, dass der deklarierte Rückgabetyp (String) nicht mit dem tatsächlichen Rückgabetyp (Unit) kompatibel ist. Dies ist der Typ des letzten Ausdrucks (while ...)

%Vor%

Antwort: fügen Sie am Ende eine Ausnahme hinzu

%Vor%     
James Iry 29.05.2012 17:26
quelle
7

Der funktionale Weg zum Definieren einer Endlosschleife ist Rekursion:

%Vor%

ellbogen % retry Funktion ohne innere loop Funktion:

%Vor%     
senia 29.05.2012 17:39
quelle
4

Der Compiler ist nicht intelligent genug, um zu wissen, dass Sie die while-Schleife leider nicht verlassen können. Es ist jedoch leicht zu tricksen, auch wenn Sie kein Mitglied des Rückgabetyps sinnvoll generieren können - werfen Sie einfach eine Ausnahme aus.

%Vor%

Nun wird der Compiler erkennen, dass er selbst dann, wenn er die while-Schleife verlässt, keinen Wert zurückgeben kann. Daher muss er sich nicht sorgen, dass die while-Schleife den Rückgabetyp Unit hat (dh keinen Wert zurückgibt). .

    
Rex Kerr 29.05.2012 16:52
quelle
4
%Vor%     
elbowich 29.05.2012 20:07
quelle
0

edit: Ich habe gerade die tatsächliche return-Anweisung bemerkt. Die return-Anweisung innerhalb der while-Schleife wird ignoriert. Zum Beispiel in der REPL:

%Vor%

Sie haben dem Compiler gesagt, dass die process() -Methode eine String zurückgibt, aber Ihr Methodenkörper ist nur eine while -Schleife, die nichts zurückgibt (es ist ein Unit oder ein Java void ). Ändern Sie entweder den Rückgabetyp oder fügen Sie nach der while-Schleife einen String hinzu.

%Vor%

oder

%Vor%     
Dylan 29.05.2012 16:26
quelle

Tags und Links