【问题标题】:How do Let expressions work in AST?Let 表达式如何在 AST 中工作?
【发布时间】:2014-06-30 18:02:22
【问题描述】:

考虑:

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

Var Nothing 指的是哪个Lit?此外,我想将其概括为 一次绑定多个,我不知道该怎么做。我从优秀的 Edward Kmett bound 包中学习了一些示例,但现在我既困惑又迷茫。

【问题讨论】:

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


    【解决方案1】:

    我稍微猜测一下,因为我以前没有见过这种绑定样式,但我认为Maybe 类型正在有效地用于编码de Bruijn indices

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

    我认为这里发生的情况是 Maybe 被用来计算活页夹的数量。所以Nothing 等价于 0 并指代最近的 binder,Just Nothing 等价于 1 并指代下一个最近的活页夹,依此类推。

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

    【讨论】:

    • 好的,但是V (Just Nothing) 不进行类型检查,是吗?
    • 应该可以,因为两个Lets里面的类型参数是Maybe (Maybe a)
    • 这几乎可以肯定。让我想起了很多 bound 的工作原理。
    猜你喜欢
    • 2018-12-26
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多