Error: This expression has type unit but an expression was expected of type inst list

Error: This expression has type unit but an expression was expected of type inst list

|ScmOp(g,h) ->newList := (createInstList **!newList** a currentReg);

这是我们的代码,我们在编译时收到上述错误。错误来自我们发送给递归函数的 !newList 参数。 newList 被定义为引用,因此我们发送 !newList 以传递其值。删除 ! 时,我们收到一个错误,我们发送了 inst 列表的 ref 而不是 inst 列表(最终我们想发送一个 inst 列表!)。

OK,我认为问题出在编译器认为createInstList returns单元。我认为这是由于 ; 的优先级。

在我看来,末尾的 !newlist 应该是整个 createInstList 函数的结果。但我怀疑它被视为内部 match.

的一部分

你可以试试这个:

let rec createInstList instList expr currentReg =
    let newList = ref instList in
    (match
           ...
        done);
    !newList