Ich versuche gerade, einen Lambda-Kalkül-Löser zu bauen, und ich habe ein kleines Problem mit der Konstruktion der AST. Ein Lambda-Calculus Begriff wird induktiv definiert als:Haskell AST mit rekursiven Typen
1) Eine variable
2) Eine Lambda, eine Variable, ein Punkt und ein Lambda-Ausdruck.
3) Ein Träger, ein Lambda-Ausdruck, ein Lambda-Ausdruck und eine Halterung.
Was würde ich tun (und zunächst versucht), ist dies:
data Expr =
Variable
| Abstract Variable Expr
| Application Expr Expr
Jetzt offensichtlich das nicht funktioniert, da Variable kein Typ ist, und abstrakte Variable Expr erwartet Typen. Also meine hacky Lösung ist zu haben:
type Variable = String
data Expr =
Atomic Variable
| Abstract Variable Expr
| Application Expr Expr
Nun ist dies wirklich ärgerlich, da ich nicht die Atomic Variable auf eigenem mögen, aber Abstrakte einen String statt einer ausdr nehmen. Gibt es eine Möglichkeit, das eleganter zu machen und es wie die erste Lösung zu machen?
Ihre zweite Definition, die Sie als geschmacklos empfinden, ist die Standardmethode. Mein Rat ist, sich daran zu gewöhnen. Du denkst auf eine Art und Weise, die nicht mit Haskells Typsystem kompatibel ist, also gehe und trainiere dich selbst. – luqui