2010-12-16 10 views
6

tengo este trozo de código:SML lista igualdad oddness

fun foldr2(f, x::xs) = 
    if xs = [] then 
     x 
    else 
     f(x, foldr2(f, xs)) 

Con la firma de tipo

(''a * ''a -> ''a) * ''a list -> ''a 

parece bastante sencillo, se necesita una función que funciona sobre tipos de igualdad y una lista del tipo de igualdad como argumentos, debido a la comparación xs = []. Sin embargo, por alguna razón funciona en entradas como (op +, [2.3, 2.7, 4.0]), cuando en SML/NJ reales no son un tipo de igualdad. ¿Alguien puede ayudarme a arrojar algo de luz sobre por qué ocurre esta magia?

+1

+1, también me pregunto por qué funciona esto. Es como si SML/NJ traduce el bloque de condición a "nulo [2.3, 2.7, 4.0]" o similar. –

Respuesta

2

Creo que tiene que ver con la forma mágica en que + está sobrecargado de reales. Para mí, este casi está a punto de ser un error del compilador, aunque tendría que mirar la definición SML97 para ver exactamente cuál es el comportamiento correcto. La sobrecarga de + es una especie de esquina oscura desagradable en SML, en mi humilde opinión.

Por ejemplo, si se define una función que es de tipo real * real -> real y pasa que como un argumento a foldr2 se obtiene el error tipo que estabas esperando:

fun f (x : real * real) = 134.5 
foldr2 (f, [1.4, 2.25, 7.0]) 
    stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required] 

Incluso puede inducir al error de tipo si simplemente agregue una anotación tipo a op +, lo que básicamente me llevó a la conclusión de que es la sobrecarga de + la que está causando el efecto misterioso.