Let表达式如何在AST中起作用?

时间:2014-06-30 18:02:22

标签: haskell abstract-syntax-tree name-binding

考虑:

data Expr a
  = V a
  | Lit Integer
  | Let (Expr a) (Expr (Maybe a))
    deriving (Eq,Show)

Let构造函数使我能够绑定表达式(第一个arg)以便在第二个引用它(V Nothing引用它)。

如果我做的话

Let (Lit 3) $ Let (Lit 1) $ Var Nothing

Lit引用的Var Nothing是什么?此外,我想概括一下 一次多个绑定,我不知道如何做到这一点。我按照优秀的Edward Kmett bound包中的一些例子,但现在我既困惑又迷失。

1 个答案:

答案 0 :(得分:9)

我有点猜测,因为之前我还没有看到过这种绑定方式,但我认为Maybe类型实际上被用来编码de Bruijn indices

基本思想是对绑定变量的引用存储为一个数字,指定要到达相关绑定器的周围绑定器的数量。因此,例如0表示最接近的周围粘合剂,1表示下一个最接近的粘合剂,依此类推。

我认为这里发生的事情是Maybe被用来计算粘合剂。因此Nothing相当于0并且指的是最接近的活页夹,而Just Nothing相当于1并且指的是下一个最接近的,依此类推。

因此,在您的示例中,V Nothing会引用Lit 1,而V (Just Nothing)会引用Lit 3