考虑:
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包中的一些例子,但现在我既困惑又迷失。
答案 0 :(得分:9)
我有点猜测,因为之前我还没有看到过这种绑定方式,但我认为Maybe
类型实际上被用来编码de Bruijn indices。
基本思想是对绑定变量的引用存储为一个数字,指定要到达相关绑定器的周围绑定器的数量。因此,例如0表示最接近的周围粘合剂,1表示下一个最接近的粘合剂,依此类推。
我认为这里发生的事情是Maybe
被用来计算粘合剂。因此Nothing
相当于0并且指的是最接近的活页夹,而Just Nothing
相当于1并且指的是下一个最接近的,依此类推。
因此,在您的示例中,V Nothing
会引用Lit 1
,而V (Just Nothing)
会引用Lit 3
。