OCaml da function `A -> 1 | _ -> 0
[> `A] -> int
el tipo, pero por qué no es que [> ] -> int
?OCaml función sobre variantes polimórficas no suficientemente polimórficas?
Esta es mi razonamiento:
function `B -> 0
tiene tipo[<`B] -> int
. Agregar una rama`A -> 0
para que seafunction `A -> 1 | `B -> 0
lo relaciona con[<`A|`B] -> int
. La función se vuelve más permisiva en el tipo de argumento que puede aceptar. Esto tiene sentido.function _ -> 0
tiene tipo'a -> int
. Este tipo es unificable con[> ] -> int
, y[> ]
es un tipo ya abierto (muy permisivo). La adición de la rama`A -> 0
para que seafunction `A -> 1 | _ -> 0
restringe el tipo de[>`A] -> int
. Eso no tiene sentido para mí. De hecho, agregar aún otra rama`C -> 1
lo hará[>`A|`C] -> int
, restringiendo aún más el tipo. ¿Por qué?
Nota: No estoy buscando soluciones, solo me gustaría saber la lógica detrás de este comportamiento.
En una nota relacionada, function `A -> `A | x -> x
tiene tipo ([>`A] as 'a) -> 'a
, y aunque eso también es un tipo abierto restrictivo para el parámetro, puedo entender el motivo. El tipo debe unificarse con 'a -> 'a
, [>` ] -> 'b
, 'c -> [>`A]
; la única forma de hacerlo parece ser ([>`A] as 'a) -> 'a
.
¿Existe una razón similar para mi primer ejemplo?
Buen motivo, gracias. Pero como efecto secundario de "grabación", esto todavía causa expresiones atractivas como '' (función 'A -> 1 | _ -> 0) ((diversión x -> (coincidencia x con' B ->()) ; x) 'B)' 'para no verificar el tipo. ¿Podría haber una razón más profunda? Esperaré un poco más antes de aceptar tu respuesta. –
Qué tipo propondrías para '' función 'A k -> k | _ -> 0''? –
gariguejej respondió eso a continuación. –