Estou me preparando para meu exame final e me deparei com um problema. O tópico é subtipagem, eu entendo como funciona a subtipagem para registros, mas para funções não entendo como funciona. Peguei o exemplo do exame, não precisa fazer o exemplo inteiro. Basta-me que alguém me explique como funciona para supertipo e para subtipo, então um exemplo para supertipo e outro para subtipo, para que eu possa me guiar por ele em outros exemplos.
Considere o tipo
{ head : int, neck : int, toes : int list} -> { hands : int, feet : int}
Para cada tipo abaixo, responda “subtipo” se for um subtipo do tipo acima, “supertipo” se for um supertipo do tipo acima, “nenhum” se nenhum, ou “ambos” se um subtipo e um supertipo. eu. { toes : int list, neck : int } -> { hands : int, feet : int}
ii. { head : int, neck : int, toes : int list} -> { hands : int, feet : int, arms : int}
iii. { toes : int list, neck : int } -> { hands : int, feet : int, arms : int}.
4. { hands : int, feet : int} -> { head : int, neck : int, toes : int list}
v.{ head : int, neck : int, toes : int list, fingers : int list} -> { feet : int}
Eu tentei com esta regra, mas isso não produz o resultado esperado.
A regra geral para subtipagem de funções é: If t3 <: t1 and t2 <: t4, then t1->t2 <: t3->t4
.
t3 <: t1
isso significa quet3 is subtype for t1
Obrigado.
Vamos tentar aplicar a regra a todos os casos.
eu.
{ toes : int list, neck : int }
é supertipo de{ head : int, neck : int, toes : int list}
, enquanto{ hands : int, feet : int}
é subtipo (e também supertipo) de{ hands : int, feet : int}
, então a regra para subtipagem de função é satisfeita, então a resposta é "subtipo".ii.
{ head : int, neck : int, toes : int list}
é supertipo (e subtipo) de{ head : int, neck : int, toes : int list}
, enquanto{ hands : int, feet : int, arms : int}
é subtipo de{ hands : int, feet : int}
, então a regra é novamente satisfeita e a resposta ainda é "subtipo".iii.
{ toes : int list, neck : int }
é supertipo de{ head : int, neck : int, toes : int list}
, enquanto{ hands : int, feet : int, arms : int}
é subtipo de{ hands : int, feet : int}
, então a regra é novamente satisfeita e a resposta é novamente "subtipo".4.
{ hands : int, feet : int}
não está relacionado a{ head : int, neck : int, toes : int list}
, então podemos concluir imediatamente que a resposta é "nenhum".v.
{ head : int, neck : int, toes : int list, fingers : int list}
é subtipo de{ head : int, neck : int, toes : int list}
, enquanto o tipo{ feet : int}
é supertipo de{ hands : int, feet : int}
então o tipo de função original é um subtipo deste e então a resposta é "supertipo".