我检查了同一错误的其他问题,但答案对我的问题没有帮助。因为我看不到类型不匹配!
我得到的错误是
Error: operator and operand don't agree [tycon mismatch]
operator domain: ?.expr list * ?.env
operand: expr list * env
in expression:
evallist (exprs,ev)
我不知道这个问号的类型是什么或它是什么意思!我可以看到,除了问号部分,类型非常相似。所以我真的不明白。
我的功能很简单
fun evallist(nil, _) = nil
| evallist (e::exprs, ev) = eval(e,ev):: evallist(exprs,ev)
它递归地计算环境中的表达式并创建结果列表。
它被简单地调用为
vals = evallist(exprs, ev)
eval
是此类val eval = fn : expr * env -> expr
的表达式评估函数。
有关问题的任何解释/想法? ?.expr list * ?.env
与expr list * env
有何不同?
谢谢!
这是重现错误的最小代码。
datatype
expr = var of string
| num of int
| appfun of expr * expr list
type env = (string * expr) list
fun eval (appfun (e, exprs), ev:env) = evallist(exprs, ev)
fun evallist(nil, _) = nil
| evallist (e::exprs, ev) =
let
val e' = eval(e,ev)
in
e':: evallist(exprs,ev)
end
答案 0 :(得分:2)
您的evallist
函数返回一个列表,eval
也是如此。如果我添加缺少的and
并使用list concatenation @
而不是consing,我可以让你的例子进行编译:
datatype
expr = var of string
| num of int
| appfun of expr * expr list
type env = (string * expr) list
fun eval (appfun (e, exprs), ev:env) = evallist(exprs, ev)
and evallist(nil, _) = nil
| evallist (e::exprs, ev) =
let
val e' = eval(e,ev)
in
e' @ evallist(exprs,ev)
end
但我必须承认,我不知道这是否是你想要的,因为这个例子已经减少了太多。