¿Cuáles son las principales diferencias entre el polimorfismo de fila y el subtipo?

20

A menudo escucho que el polimorfismo de fila es un enfoque mejor que el subtipo, pero tengo dificultades para encontrar algo que los compare en detalle. Estoy especialmente interesado en la perspectiva de un usuario del sistema.

Me encontré con esta publicación de blog, pero me deja con más preguntas que antes. Por ejemplo, afirma que un sistema con subtipificación asignará un tipo, mientras que un sistema con tipificación de fila asignará otro; ¿significa eso que si un sistema que supuestamente tiene subtipado asigna el tipo de "tipeo de fila", que lo hace incorrectamente?

La principal diferencia que veo es que el tipo de fila hace posible alinear los tipos de argumentos (es decir, escribir una función de dos argumentos que se ocupa solo del acampo de sus argumentos, pero requiere que sus argumentos tengan los mismos campos) .

Alex R
fuente

Respuestas:

10

El subtipo dice que dada una expresión de un tipo, también podemos darle otro tipo. Decimos que el primero es un subtipo del segundo y esta relación de subtipo induce muchas otras relaciones. En símbolos,

ΓE:SS<:TΓE:T

(α.τ)<:τ[T/α]T

{1:A,2:B}<:{2:B,1:A}{1:A,2:B}{2:B,1:A}STS<:TT<:S{1:A,2:B}={2:B,1:A}T<:T

Por lo general, cuando hablamos de un lenguaje con el que subtipificación una media con una relación de subtipos no trivial en la tierra tipos, es decir, los tipos sin variables libres (que, por supuesto, puede y va a generar relaciones de tipificación para los tipos no-tierra). Por lo tanto, un sistema con polimorfismo de fila como el de Roy no es un lenguaje con subtipo en este sentido, aunque tiene la relación de subtipo no trivial que proviene de cualquier lenguaje polimórfico paramétrico implícitamente instanciado. El subtipo estructural, por otro lado, establece explícitamente relaciones de subtipo no triviales para tipos de suelo.

()arriba, el subtipo estructural implica tipos de fila pero no viceversa. El polimorfismo paramétrico es ortogonal (en el sentido de que puede tenerlo o no, definitivamente hay interacciones) con los tipos de fila o el subtipo estructural. Un sistema con subtipo estructural + polimorfismo paramétrico subsume el tipo de fila + polimorfismo paramétrico (suponiendo algún tipo de "unión de registros") en el sentido de que cada término en el último puede escribirse con el mismo tipo en el primero. El primero solo puede escribir con tipos adicionales también. Usando el ejemplo de Brian, en un sistema con subtipos estructural y el polimorfismo paramétrico answertendría el mismo tipo que el de la versión de fila de escribir, sino que también tendría el tipo de la versión de subtipos así .

ρ{ c : Number }información: pasar de un subtipo a un supertipo pierde información (tipo). Esto a menudo puede ser lo que desea: hay un tipo común que le importa y todo lo demás son detalles irrelevantes. Mi sesgo es mantener tanta información de tipo como sea posible y solo descartarla explícitamente. Las desventajas del enfoque del subtipo a menudo se evidencian en programas que son de tipo correcto, pero solo porque los tipos fueron empujados a un tipo "superior" (n sin información), por ejemplo, el registro vacío. Reiterando, el polimorfismo paramétrico (en general) conserva la información de tipo, el subtipo la pierde intencionalmente.

Derek Elkins
fuente
¡Gracias por la respuesta detallada! Otra pregunta: si el subtipo estructural + polimorfismo paramétrico subsume la tipificación de filas + polimorfismo paramétrico, ¿por qué usaría este último?
Alex R
@AlexR Como Brian mencionó en su publicación de blog, el subtipo interactúa extremadamente mal con la inferencia de tipos y muchos otros aspectos, como el problema ergonómico que mencioné. También hay problemas de implementación y complejidad del lenguaje. Para ser justos, existe un amplio espacio de diseño tanto para los "tipos de filas" como para los subtipos, por lo que los "subsumes" son una declaración aproximada.
Derek Elkins