2016-04-21 10 views
2

Ich habe diesen Code-SchnipselOperator Operand Typenkonflikt

fun decrement_to_zero r = if !r < 0 
          then r := 0 
          else while !r >= 0 do r := !r - 1 

aus diesem Tutorial

https://learnxinyminutes.com/docs/standard-ml/

Aber ich bekomme diese Fehlermeldung:

stdIn:1.2-33.9 Error: operator and operand don't agree [literal] 
    operator domain: int ref 
    operand:   int 
    in expression: 
    decrement_to_zero 10 

, wenn ich es mit

nennen

- decrement_to_zero 10;

Warum?

Antwort

3

Why?

Wenn Sie die Funktion des Typs Unterschrift prüfen

- decrement_to_zero; 
> val it = fn : int ref -> unit 

können Sie bestätigen, dass seine Eingangstyp nicht mit 10 : int nicht ausrichten. Aber wenn Sie ein int ref,

- val foo = ref 10; 
> val foo = ref 10 : int ref 

und übergeben diese an Ihre Funktion erstellen,

- decrement_to_zero foo; 
> val it =() : unit 

Sie werden sehen, dass die Referenz aktualisiert wurde, aber nicht auf Null,

- foo; 
> val it = ref ~1 : int ref 

So wurde der Name der Funktion ziemlich schlecht gewählt und geschrieben. Es scheint, dass mit diesem Tutorial viel schief gelaufen ist, seit ich es geschrieben habe.

Obwohl Standard ML Referenzen unterstützt, ist es oft idiomatischer, reine Funktionen zu schreiben. Eine reine Funktion nimmt nur Werte als Eingabe und gibt Werte als Ausgabe zurück, beeinflusst aber nicht die Welt außerhalb der Funktion (wie z. B. die Referenz foo auf einen bestimmten Zeitpunkt zeigt). So zum Beispiel,

fun actually_decrement_to_zero n = 
    if n > 0 then actually_decrement_to_zero (n-1) else n 

Und dies unter Verwendung

- actually_decrement_to_zero 10; 
> val it = 0 : int 

Wie Sie sehen können, kommt das Ergebnis direkt aus der Funktion, anstatt indirekt über einen Verweis.

+0

Trotz des Fehlers mit dieser Funktion scheint es immer noch wie ein nettes kleines Tutorial. –

+0

Danke! Aus kurzen Tutorials wie diesen habe ich viel gelernt. Ich habe Referenzen als eine bewusste Entscheidung ausgelassen, weil ich dachte, dass es den Menschen bei der funktionalen Programmierung den richtigen Weg zeigen würde, aber jetzt ist mir klar, dass es besser ist, ein schlechtes Feature durch ein gutes Beispiel zu lehren, als durch ein schlechtes. ;-) –

Verwandte Themen