SML错误:未解析的弹性记录

时间:2018-02-08 17:13:48

标签: pattern-matching sml

我刚刚开始学习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网站上查找,但在这里却无法弄明白。对此有任何建议将不胜感激。

1 个答案:

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