Как выражения позволяют работать в AST?

Рассматривать:

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

Let Конструктор позволяет мне связать выражение (первый аргумент), чтобы ссылаться на него во втором (V Nothing относится к этому).

Если я сделаю что-то вроде

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

который Lit делает Var Nothing Ссылаться на? Кроме того, я хотел бы обобщить это для нескольких привязок одновременно, и я понятия не имею, как это сделать. Я следовал за некоторыми примерами из превосходного пакета Эдварда Кметта, но теперь я и растерян, и потерян.

1 ответ

Решение

Я предполагаю немного, потому что я не видел этот стиль связывания раньше, но я думаю, что Maybe Тип эффективно используется для кодирования индексов де Брейна.

Основная идея заключается в том, что ссылки на связанные переменные хранятся в виде числа, определяющего количество окружающих связующих, которые необходимо пройти, чтобы достичь соответствующего связующего. Так, например, 0 будет относиться к ближайшему окружающему связующему, 1 - к следующему ближайшему, и так далее.

Я думаю, что здесь происходит, что Maybe вместо этого используется для подсчета связующих. Так Nothing эквивалентно 0 и относится к ближайшему связующему, и Just Nothing эквивалентно 1 и относится к следующему ближайшему, и так далее.

Так что в вашем примере V Nothing будет относиться к Lit 1, в то время как V (Just Nothing) будет относиться к Lit 3,

Другие вопросы по тегам