Domanda

Sono nuovo in ML e ho provato funzioni semplici, ma ho problemi a cercare di ottenere funzioni per lavorare con numeri reali. Ad esempio, questa funzione inversa ....

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

Ottengo l'output di proper per numeri interi e stringhe.

    - 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

Qualcuno può spiegarmi perché questa funzione non funzionerà con numeri reali?

Ecco l'output quando provo i veri ...

    - 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)
È stato utile?

Soluzione

real non è un tipo di uguaglianza in ml, e quindi nemmeno i tipi polimorfici sono costruiti reals - in particolare, real lists non sono tipi di uguaglianza e quindi non è possibile utilizzare l'operatore = per confrontare due real lists, anche se quelle liste sono vuote. Invece, è necessario abbinare il pattern. Per esempio,

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

o

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

funzionerà anche per tipi di non qualità.

(In alternativa, utilizzare la funzione integrata List.rev.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top