SML运算符和操作数不同意[tycon mismatch]

时间:2017-11-15 16:07:29

标签: types functional-programming sml smlnj

我检查了同一错误的其他问题,但答案对我的问题没有帮助。因为我看不到类型不匹配!

我得到的错误是

  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 * ?.envexpr 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

1 个答案:

答案 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

但我必须承认,我不知道这是否是你想要的,因为这个例子已经减少了太多。