Frage

Ich bin neu in ML und habe einfache Funktionen ausprobiert, aber ich habe Probleme, Funktionen zu erhalten, um mit realen Zahlen zu arbeiten. Zum Beispiel diese umgekehrte Funktion ....

    fun reverse (nil) = nil
      | reverse (x::xs) = if xs = nil then [x]
                         else (reverse xs) @ [x];

Ich bekomme die Propterausgabe für Ganzzahlen und Saiten.

    - reverse [1,2,3,4];
    val it = [4,3,2,1] : int list
    - reverse ["a" , "b" , "c" , "d" ];
    val it = ["d","c","b","a"] : string list

Kann mir jemand erklären, warum diese Funktion nicht mit realen Zahlen funktioniert?

Hier ist die Ausgabe, wenn ich es versuche, Reals ...

    - reverse [1.0, 2.0];
    stdIn:1.2-53.9 Error: operator and operand don't agree [equality type required]
      operator domain: ''Z list
      operand:         real list
      in expression:
        reverse (1.0 :: 2.0 :: nil)
War es hilfreich?

Lösung

real ist kein Gleichheitstyp in ML, und daher sind auch keine polymorphen Typen aus konstruiert realinsbesondere s - real lists sind keine Gleichstellungsarten, und Sie können den Bediener nicht verwenden = zwei vergleichen real lists, auch wenn diese Listen leer sind. Stattdessen müssen Sie Match -Match. Zum Beispiel,

fun reverse [] = []
  | reverse (x::xs) = (reverse xs) @ [x]

oder

fun reverse [] = []
  | reverse (x::xs) = case xs of
                           [] => [x]
                         | _ => (reverse xs) @ [x]

wird auch für Nicht -Nive -Typen funktionieren.

(Verwenden Sie abwechselnd die integrierte Funktion List.rev.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top