В настоящее время я пытаюсь построить решатель расчета лямбда-исчисления, и у меня есть небольшая проблема с построением AST. Термин лямбда-исчисление индуктивно определяется следующим образом:Haskell AST с рекурсивными типами
1) Переменная
2) лямбда, переменная, точка, и лямбда-выражение.
3) Скобка, выражение лямбда, выражение лямбда и скобка.
То, что я хотел бы сделать (и на первый пробовал) заключается в следующем:
data Expr =
Variable
| Abstract Variable Expr
| Application Expr Expr
Теперь, очевидно, это не работает, так как переменная не является типом, и реферата Variable Expr ожидает типов. Так что мой Hacky решение это должно иметь:
type Variable = String
data Expr =
Atomic Variable
| Abstract Variable Expr
| Application Expr Expr
Теперь это действительно раздражает, так как я не люблю атомарной переменной по себе, но абстрактные принимая строку, а не выраж. Есть ли способ сделать это более элегантным и сделать это, как первое решение?
Ваше второе определение, которое вы считаете отвратительным, является стандартным способом сделать это. Мой совет, привыкнуть к этому. Вы думаете, что это несовместимо с системой типа Haskell, поэтому отправляйтесь вперед и тренируйте себя. – luqui