在Pierce的Tapl书中,他指出,通过某种动态类型测试,可以更换一个下铸造的操作员。然后他给出了以下规则:

t-typeTest:

$ \ dfrac {\ gamma \ vdash t_1:s \; \ gamma,x:t \ vdash t_2:u \; \; \ gamma \ vdash t_3:u} {\ gamma \ vdash \ text {if} t_1 \ text {in} t \ text {the} x \ to t_2 \ text {else} t_3 \ to t_3:u} $

e-typeTest1:

$ \ dfrac {\ vdash v_1:t} {\ text {if} v_1 \ text {in} t \ text {den} x \ to t_2 \ text {else} t_3 \ to [x \ mapsto v_1] t_2} $

e-typeTest2:

$ \ dfrac {\ nvdash v_1:t} {\ text {if} v_1 \ text {in} t \ text {den} x \ to t_2 \ text {else} t_3 \ to t_3} $

没有进一步的解释,我没有意识到如何解释这些规则。审查它们,我意识到第一个是打字规则,第二个和第三是评估规则。但是,语法有点奇怪。 IF的每个分支中的箭头是什么?为什么如果包括insyntax?

有帮助吗?

解决方案

第一个规则t-typeTest是一种类型检查规则。让我们一起读它。首先, $ \ gamma $ 并不重要(至少在第一次读数上)。我们有以下场所:

  1. $ t_1 $ 具有类型 $ s $
  2. 如果 $ x $ 具有类型 $ t $ 那么 $ t_2 $ 有类型 $ u $
  3. $ t_3 $ 具有类型 $ u $
  4. 得出的结论是,我们得到了类型 $ u $ (我认为转录应该具有“ $ :U $ “而不是 $ \ to t_3 $ 结论): $$ \ mathrm {if} \; t_1 \; \ mathrm {in} \; t \; \ mathrm {然后} \; x \ to t_2 \; \ mathrm {else} \; t_3 \ tag {1} $$ 这种表达式的含义可以通过观察其他两个规则来透露,这是小型操作语义。这是一个错误的解释,我们将在瞬间做出正确:

    1. 如果 $ t_1 $ 类型 $ t $ 那么(1)评估<跨越类=“math-container”> $ t_2 $ 使用 $ x $ 替换为 $ t_1 $ < / span>。这就是“触觉”的情况,即 $ t_1 $ $ s $ 到<跨越类=“math-container”> $ t $ ,触觉值绑定到 $ x $ ,然后 $ t_2 $ 执行。

    2. 如果 $ t_2 $ 没有类型 $ t $ 那么(1)评估到 $ t_3 $ 。这是我们在无法触觉时使用的“默认”。

    3. 以上解释是不正确的,因为我们应该使用 $ v_1 $ 而不是 $ t_1 $ ,by哪个作者正在告诉您:首先评估 $ t_1 $ to $ v_1 $ ,然后执行悲伤。

      在虚构的OO语言中,同样的事情可能是一个如此:

      S t1 = ...;
      ...
      if (t1 instanceof T) {
        T x = (T)t1;
        t2;
      } else {
        t3;
      }
      
      .

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top