为什么我的sml代码中会出现这些错误?

为什么我的sml代码中会出现这些错误?,sml,Sml,我正在为一个作业用标准ML创建一个标准ML解释器,但我似乎无法解决这个问题 我在函数eval中有这个条件: | eval (rho, SetExp (name, value)) = (case rhoContains rho name of true => rhoSet rho name value | false => globalSet (name, value)) 以及以下辅助功能: fun rhoSet [] key value

我正在为一个作业用标准ML创建一个标准ML解释器,但我似乎无法解决这个问题

我在函数
eval
中有这个条件:

| eval (rho, SetExp (name, value)) =
    (case rhoContains rho name of
        true    => rhoSet rho name value
    |   false   => globalSet (name, value))
以及以下辅助功能:

fun rhoSet [] key value = [(key, value)]
  | rhoSet ((elt as (k, v)) :: tail) key value =
        if key = k then (key, value) :: tail else elt :: rhoSet tail key value

fun rhoContains rho name =
    case rhoGet rho name of SOME _ => true | NONE => false

fun globalSet key value =
    let fun f [] = [(key, value)]
        | f ((k,v)::tail) = if k = key then (k,value)::tail else (k,v)::f tail
    in globals := f (!globals) end
尝试运行此操作会导致以下错误:

eval.sml:61: error: Clauses in case have different types.
Clause 1: true => rhoSet rho name value : bool -> (string * expression) list
Clause 2: false => globalSet (name, value) : bool -> int -> unit
Reason:
    Can't unify (string * expression) list to int -> unit
        (Incompatible types)

我不确定这一点出了什么问题,如果有任何帮助,我将不胜感激。

这看起来很类似,函数必须始终返回相同类型的值。您计划如何使用列表或
单位的值?您还将一对传递给
globalSet
,这是它不希望的。(我认为您需要花更多的时间思考类型,少写代码。)