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