Привет Я пишу интерпретатор C-like, статически типизированного языка в Haskell. Я хочу выполнить проверку типов перед выполнением кода, но у меня есть некоторые проблемы с ним. Прежде всего, ниже есть некоторые определения типа от моего абстрактного синтаксиса:Переводчик небольшого императивного языка
newtype Ident = Ident String deriving (Eq,Ord,Show)
data Exp = {-- some other value constructors --} | EFuncWithParams Ident [Exp]
data Type = TInt | TDouble | {-- some other value constructors --} | TFunction [Exp]
type TCM a = ErrorT String (Reader Env) a
ТСМА для сообщений об ошибках и передач окружающей среды, например:
typeof (EVar v) = do
env <- ask
case M.lookup v env of
Nothing -> throwError $ "undefined variable" ++ v ++ "\n"
Just t - > return t
Теперь я хочу, чтобы проверить тип выражения так Я следующая функция, которая выполняет проверку:
typeof Exp :: Exp -> TCM Type
Она определяется для всех случаев, но один:
typeof (EFuncWithParams f l)
Я застрял здесь. Я думаю, что мне нужно проверить тип f (я имею в виду, прежде всего, проверить, действительно ли это функция) и посмотреть, будут ли типы аргументов, записанные в определении f сопоставляемых типов аргументов, которые фактически переданы. К сожалению, я новичок в haskell и понятия не имею, как правильно это выразить. Любые предложения будут высоко оценены :)
EDIT: ОК, Возможно, это не означает, что я писал здесь ранее, но EFuncWithParams Ident [Exp] - это вызов функции на самом деле (да, я знаю, что это несколько вводит в заблуждение) и Я хочу, чтобы иметь возможность вызвать функцию, как f (2 + 3, a, b [0]), и именно поэтому я использовал TFunction [Exp]. Объявление функции и определение является утверждение и определяется:
data Function_def =
Func Type_specifier Declarator Compound_stm
deriving (Eq,Ord,Show)
где описатель является:
data Declarator = FuncDec Ident Parameter_declarations
декларации параметров является список Type_specifiers и идент
То, что я думаю, что нужно сделать, это сохраняйте тип функции на карте, проверяя ее декларацию, а затем извлекайте ее здесь. Я имею в виду также:
typeof_stm :: Stm -> TCM Type -- Function_def is a statement
Проблема заключается в том, что у меня есть отдельная функция для операторов типа проверки, и я нахожусь в сомнении ли автоматически передается карта, используемая одной функции (например, typeof_stm.) В другой (например, typeof). Я не вижу, чтобы это произошло, но, возможно, я ошибаюсь.
Как вы представляете как типы аргументов функции, так и тип результата функции? –