Quelles sont les principales différences entre le polymorphisme des lignes et le sous-typage

20

J'entends souvent que le polymorphisme des lignes est une meilleure approche que le sous-typage, mais j'ai du mal à trouver quoi que ce soit en les comparant en détail. Je suis particulièrement intéressé par la perspective d'un utilisateur du système.

J'ai rencontré ce billet de blog, mais il me laisse plus de questions qu'auparavant. Par exemple, il prétend qu'un système avec sous-typage affectera un type, tandis qu'un système avec typage en ligne en affectera un autre; cela signifie-t-il que si un système qui prétendument a du sous-typage attribue le type "typage de ligne", qu'il prétend de manière incorrecte?

La seule différence majeure que je vois est que le typage des lignes permet d'aligner les types d'arguments (c'est-à-dire d'écrire une fonction à deux arguments qui ne concerne que le achamp de ses arguments, mais nécessite que ses arguments aient les mêmes champs) .

Alex R
la source

Réponses:

10

Le sous-typage indique que, étant donné l'expression d'un type, nous pouvons également lui donner un autre type. Nous disons que le premier est un sous-type du second et cette relation de sous-typage induit de nombreuses autres relations. En symboles,

ΓE:SS<:TΓE:T

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

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

Habituellement, lorsque nous parlons d'un langage avec sous-typage, nous entendons un langage avec une relation de sous-typage non triviale sur les types sol , c'est-à-dire des types sans variables libres (qui, bien sûr, peuvent et vont générer des relations de sous-typage pour les types non sol). Donc, un système avec un polymorphisme de lignes comme celui de Roy n'est pas un langage avec sous-typage dans ce sens, bien qu'il ait la relation de sous-type non triviale qui vient de tout langage polymorphe paramétrique implicitement instancié. Le sous-typage structurel, d'autre part, énonce explicitement des relations de sous-typage non triviales pour les types de sol.

()ci-dessus, le sous-typage structurel implique des types de lignes mais pas l'inverse. Le polymorphisme paramétrique est orthogonal (dans le sens où vous pouvez l'avoir ou non, il y a certainement des interactions) avec les types de lignes ou le sous-typage structurel. Un système avec sous-typage structurel + polymorphisme paramétrique subsume le type de ligne + polymorphisme paramétrique (en supposant une sorte d '"union d'enregistrement") dans le sens où chaque terme dans ce dernier peut être tapé avec le même type dans le premier. Le premier est également capable de taper avec des types supplémentaires. En utilisant l'exemple de Brian, dans un système avec sous - typage structurel et du polymorphisme paramétrique answeraurait le même type que celui de la ligne la version de frappe, mais il aurait aussi le type de la version sous - typage ainsi .

ρ{ c : Number }information: passer d'un sous-type à un super-type perd (type) les informations. Cela peut souvent être ce que vous voulez: il y a un type commun qui vous intéresse et tout le reste n'est que des détails non pertinents. Mon parti pris est de conserver autant d'informations de type que possible et de les rejeter explicitement. Les inconvénients de l'approche du sous-typage sont souvent mis en évidence par des programmes dont le type est correct, mais uniquement parce que les types ont été poussés vers un type "top" (n sans information), par exemple l'enregistrement vide. Réitérant, le polymorphisme paramétrique (en général) préserve les informations de type, le sous-typage les perd intentionnellement.

Derek Elkins a quitté SE
la source
Merci pour la reponse detaillee! Une autre question: si le sous-typage structurel + le polymorphisme paramétrique subsume le typage des lignes + le polymorphisme paramétrique, pourquoi utiliseriez-vous jamais ce dernier?
Alex R
@AlexR Comme Brian l'a mentionné dans son article de blog, le sous-typage interagit extrêmement mal avec l'inférence de type et de nombreux autres aspects, tels que le problème ergonomique que j'ai mentionné. Il y a aussi des problèmes d'implémentation et de complexité de la langue. Pour être juste, il existe un large espace de conception pour les "types de lignes" et les sous-types, donc les "subsumes" sont une déclaration approximative.
Derek Elkins a quitté le SE