¿Cuál es la diferencia entre ‘a’ y ‘_l?

¿Cuál es la diferencia entre 'a '_l y '_l ?

Estaba viendo este error y no podía comprenderlo:

 Error: This expression has type ('a -> float polynomial) list but an expression was expected of type float polynomial list derivlist: ('_l → float polynomial) list 

_ denota una variable débilmente polimórfica: está en una posición en la que no se puede generalizar.

Hay dos explicaciones relacionadas con el polymorphism débil en el OCaml Preguntas frecuentes: ver Una función obtenida a través de la aplicación parcial no es lo suficientemente polimórfica y la siguiente.

Esto generalmente ocurre cuando estás usando una referencia no local (cuyo tipo no se puede generalizar), o cuando defines funciones polimórficas que no son sintácticamente funciones (no comienzan con fun x -> .. sino más bien una aplicación de función). En algunos casos hay una solución fácil (expansión de eta, consulte las preguntas frecuentes), a veces no, y algunas veces su progtwig no era correcto.

Un ejemplo fácil: let a = ref [] no obtiene el tipo de a list ref polimórfica. De lo contrario, podría usar ambos como una int list y una bool list , y mezclar elementos de diferentes tipos al mutar la referencia. En su lugar, obtiene un tipo de '_a list ref . Esto significa que el tipo no es polimórfico, sino simplemente desconocido . Una vez que haces algo con a tipo particular, se corrige '_a una vez por todas.

 # let a = ref [];; val a : '_a list ref = {contents = []} # let sum_of_a = List.fold_left (+) 0 !a;; val sum_of_a : int = 0 # a;; - : int list ref = {contents = []} 

Para una explicación más detallada de la restricción de valor y la restricción de valor “relajado” implementada en realidad en el verificador de tipo OCaml, consulte el documento Relajar el valor de restricción de Jacques Garrigue (2004).

Hay una variable de tipo débil en el mensaje de error del comstackdor, pero no estoy seguro de que la variable débil esté relacionada con el error (no veo cómo el estado de la variable de tipo podría ser la causa de este mensaje).

¿Estás seguro de que no estás definiendo dos tipos de polynomial ? Esa es la pregunta justo arriba de las dos señaladas por gashe en su respuesta en las preguntas frecuentes (” Mensaje de error: un tipo no es compatible consigo mismo “).