嗨,我正在用 Haskell 编写类似 C 的静态类型语言的解释器。我想在执行代码之前执行类型检查,但是我遇到了一些问题。首先,下面有一些来自我的抽象语法的类型定义:
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
TCM 用于报告错误和传递环境,例如:
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 新手,不知道如何以正确的方式表达它。任何建议将不胜感激:)
编辑:好的,我之前在这里写的内容可能没有暗示,但 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 和 Idents 的列表
我认为我应该做的是在检查其声明时将函数类型保存在地图中,然后在此处获取它。我的意思是我也有:
typeof_stm :: Stm -> TCM Type -- Function_def is a statement
问题是我有一个用于类型检查语句的单独函数,我怀疑一个函数(例如 typeof_stm)使用的映射是否自动传递给另一个函数(例如 typeof)。我认为这不会发生,但也许我错了。