Я пытался написать небольшой компилятор в течение последних нескольких недель, читая отличный учебник Стивена Диля «Напиши тебе на Haskell». В настоящее время я пишу интерпретатор, прежде чем писать компилятор.
У меня есть проблемы с представлением моих значений, оцененных из приложения-конструктора алгебраического типа данных (например, в Haskell Just 1
, Left "error"
и т. д.).
Мои значения в настоящее время представлены следующим типом:
data Value
= Int Integer
| Flt Double
| Chr Char
| Str String
| Lam Name AST.Expr (Scope Value)
| HLam (Value -> Value)
Как реализовать конструкторы типов?
До сих пор я думал об этом:
data Value
= Int Integer
| Flt Double
| Chr Char
| Str String
| App Constr [Value] -- Constr applied of [Value]
| Lam Name AST.Expr (Scope Value)
| HLam (Value -> Value)
-- Constructor ID and signature
-- would be translated to a lambda abstraction
data Constr = Constr Name [Type]
Но мне пришлось бы проверять каждый раз, когда я работаю с конструктором, равны ли длины подписи и количество применяемых значений.
Есть ли другое решение?
Заранее спасибо.