OCaml gibt Werte zurück

8

In dem Buch 'Anwendungen mit OCaml entwickeln' gibt es die folgende Erklärung bezüglich der Rückgabewerte:

  

Da der Wert vor einem Semikolon verworfen wird, gibt Objective CAML eine Warnung aus, wenn sie nicht vom Typ unit ist.

%Vor%

Ich verstehe nicht, warum es ein Problem wäre, dass 2 einen anderen Rückgabewert als unit hat, weil ich nicht 2 zurückgeben, sondern 3 zurückgeben möchte. So wie ich es verstehe, ist jede Anweisung vor meiner allerletzten Anweisung nicht der Rückgabewert der Funktion, also warum die Warnung?

Ich habe diese Warnung überall in meinem Code erhalten und es wird mir klar, dass ich nicht wirklich verstehe, wie die Rückgabewerte in OCaml wirklich funktionieren.

Danke für Ihre Hilfe.

    
GiantSquid 15.06.2011, 06:40
quelle

2 Antworten

5

Betrachte den Ausdruck e1 ; e2 . Definitionsgemäß bedeutet die Auswertung dieses ganzen Ausdrucks die Auswertung von e1 und dann e2 und der resultierende Wert des gesamten Ausdrucks ist der Wert von e2 . Das Wertergebnis von e1 wird verworfen. Dies ist nicht das Problem, wenn der Typ von e1 unit ist, weil er den einzigen einzelnen Einwohnerwert () hat. Für alle anderen Typen bedeutet das Verwerfen des Ergebnisses von e1 das Verlieren von Informationen, was wahrscheinlich nicht das ist, was der Programmierer beabsichtigt hat, daher die Warnung. Der Programmierer muss den Ergebniswert explizit ignorieren, entweder mit ignore oder mit

%Vor%

Typ-Annotation kann weggelassen werden, aber es kann nützlich sein, sicherzustellen, dass e1 vollständig auf den erwarteten Typ evaluiert wird (keine Teilapplikation).

    
ygrek 15.06.2011, 07:32
quelle
4

Nun, die Warnung ist da, weil die Tatsache, dass du einen Wert produzierst, ihn dann aber nicht benutzt (und sehr oft ist) ein Anzeichen dafür ist, dass du etwas falsch machst. Wenn Sie dieser Richtlinie nicht zustimmen, können Sie diese Warnung deaktivieren. Aber wie immer ist es eine gute Übung, dies nicht zu tun. In diesem Fall können Sie, wenn Sie wirklich keinen Wert eines Ausdrucks benötigen, ihn ignorieren oder an _ binden, wie in let _ = f() in ... .

    
akoprowski 15.06.2011 07:31
quelle

Tags und Links