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.
Trotz des Fehlers mit dieser Funktion scheint es immer noch wie ein nettes kleines Tutorial. –
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. ;-) –