Types SML运算符和操作数don';不同意[泰康不匹配]

Types SML运算符和操作数don';不同意[泰康不匹配],types,functional-programming,sml,smlnj,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) 我不知道这个类型的问号是什么,或者它是什么意思!我能看到

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

我得到的错误是

  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
有何不同

谢谢你

这是再现错误的最小代码

更新代码
您的
evallist
函数返回一个列表,
eval
也返回一个列表。如果我添加缺少的
,并使用列表串联
@
,而不是考虑:

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

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

什么是
eval
?请把这个做成一个盒子。另外,请看关于问号的这篇文章:SML/NJ以一些隐晦的错误消息而闻名。感谢您的帮助。我更新了问题。在我发布我的问题之前,我确实看了这个问题,但我认为它在这里不可行,因为我没有重新定义/隐藏我的任何变量!我觉得这太傻了,我怀疑这和类型推断有关,但我不确定到底发生了什么。有什么想法吗?如果看不到更多的代码,很难说出发生了什么。您显示的代码似乎没有问题,因此问题必须涉及您未显示的代码。你能给我个建议吗?注意:这并不是自动转储所有代码,它应该是最小的,受允许其他人重现问题的约束。因此——将其最小化。查找重现问题的
expr
eval
的最简单定义(例如,仅使用int文本计算
+
)。调试您甚至看不见的代码是很困难的。正如链接所暗示的那样,做出这样一个例子的努力通常会让你自己发现错误。如果没有,那么做出这样一个例子的努力将允许其他人帮助你。好的@JohnColeman,这里有一个最小的、完整的、可验证的例子,可以重现错误。:)隔离它很好,但我仍然看不出问题出在哪里。我当然希望你能!谢谢你的帮助!
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