На практике я пытаюсь определить тип, соответствующий выражениям лямбда-исчисления, состоящим из переменных, абстракций и приложений. Моя текущая лучшая попытка:
type expr = Var of string | Abs of expr * expr | App of expr * expr
Однако я хотел бы ограничить первую часть Abs
значением Var
. Например, я хотел бы, чтобы это было плохо сформированное выражение:
Abs(Abs(Var "foo", Var "bar"), Var "bar")
но в настоящее время оно считается действительным. Я также хотел бы потребовать, чтобы первая часть App
была Abs
. Есть ли способ заставить систему типов применять эти ограничения, или это толкает ее за пределы того, для чего она была предназначена?
Редактировать: Если неясно, Abs(Var "x", Var "x")
следует считать действительным.