我刚刚开始学习SML,我正在尝试创建一个给定环境和变量名的函数,返回与变量名相关联的int值。例如,如果环境e3是[(“y”,100),(“x”,200)],那么调用查找e3“y”应该返回100.这就是我到目前为止所做的。
fun lookup nil name = raise NameNotBound name
| lookup Env name =
let
val e = tl Env;
in
if #1(hd Env) = name
then #2(hd Env)
else lookup e name
end;
然而,当我运行这个时,我收到错误消息“错误:未解析的flex记录(需要知道此上下文中所有字段的名称) type:{1:string,2:'Y; “Z}
老实说,我真的不确定这个错误意味着什么,我已经尝试在smlnj网站上查找,但在这里却无法弄明白。对此有任何建议将不胜感激。
答案 0 :(得分:4)
当您对值使用记录/元组访问器(例如#1
或#2
)时,SML需要事先知道该值的类型。通常这意味着赋予值一个显式类型。所以你可以给Env
一个类型注释,这样可以解决错误。
或者您可以不使用#1
和#2
,而是使用模式匹配来访问元组的成员(这也可以避免使用不安全的tl
和{{ 1}}功能)。这看起来像这样:
hd
然后您可以使用| lookup ((headName, headValue) :: tail) name =
代替headName
,#1(hd Env)
代替headValue
和#2(hd Env)
代替tail
。