Pregunta

Soy nuevo en ML y he estado probando funciones simples, pero tengo problemas para tratar de obtener funciones para trabajar con números reales. Por ejemplo, esta función inversa ....

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

Obtengo la salida PROPPER para enteros y cadenas.

    - 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

¿Alguien puede explicarme por qué esta función no funcionará con números reales?

Aquí está la salida cuando intento reales ...

    - 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)
¿Fue útil?

Solución

real no es un tipo de igualdad en ml, por lo que tampoco se construyen tipos polimórficos de reals - en particular, real lists no son tipos de igualdad, por lo que no puede usar el operador = para comparar dos real listS, incluso si esas listas están vacías. En cambio, debe coincidir con el patrón. Por ejemplo,

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

o

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

funcionará incluso para tipos de no calidad.

(Alternativamente, use la función incorporada List.rev.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top