我正在使用SML为另一种函数式语言设计编译器(你可以在这里看到它的定义http://corelab.postech.ac.kr/~hanjun/2016S_compiler/hw/fun_language_definition.php)。我的任务是设计一个类型检查。
什么是返回类型?
if a>0 then <<3, 4>, 5> else <<6>, 7, 8>
为了回答这个问题,我需要找到&#34;加入&#34;以上2种类型。 &#34;加入&#34;:是最不常见的超类型。例如,t1 <: t3
和t2 <: t3 => t3
是join(t1,t2)
。
&#34;满足&#34;是最常见的亚型。 t3 <: t1
和t3 <: t2 => t3
是meet(t1, t2)
。
我的设计任务满足并加入相互递归。 能否请你给我一个如何实施它们的提示?
答案 0 :(得分:0)
您需要研究子类型规则以推断递归定义。例如,使用元组类型。由于较长的元组是较短元素的子类型,因此公共前缀类型匹配,如果元素类型是成对子类型,则一个元组类型是花药的子类型,您将拥有:
join(<t1, ... tm>, <u1, ... un>) = <join(t1,u1), ... join(tp,up)>
where p = min(m,n)
和
meet(<t1, ... tm>, <u1, ... un>) = <meet(t1,u1), ... meet(tm,um), u_m+1, ... un>
when (wlog) m <= n
大多数规则都是这样的自我递归。由于参数反转,异常将是函数类型。在这里,你需要见面来定义连接,反之亦然。通过给出答案,我不会破坏你的乐趣。
基本情况当然只是
meet(int, int) = join(int, int) = int