SML Error: operator and operand don't agree [tycon mismatch]

SML Error: operator and operand don't agree [tycon mismatch]

我是 SML 的新手,不太了解我的问题,但我确定我有错。首先,这是我正在测试的两个简短函数及其描述。

MakeInterval - 取一个自然数 r,(也用于 rp)和一个自然数 t,returns 区间 [t-r,t+r].

fun MakeInterval(r,rp,t) =
    if r + rp < 0 then []
    else t-r :: MakeInterval(r-1,rp,t);

例如MakeInterval(3,3,10) 将 return [7,8,9,10,11,12,13]。如果您有摆脱 rp 的建议,请告诉我。这是我能想到的在保持排序顺序的同时跟踪 r 的原始值的唯一方法。

NotDivisible - 采用自然数 r,自然数列表 ts1 和另一个自然数列表ts2。使用 ts2 的代码尚未编写。

r指定区间的下限和上限,(与MakeInterval相同),ts1是一个数字列表使用 MakeInterval 函数输入 map

fun NotDivisible(r, ts1, ts2) = 
    map (fn x => MakeInterval(r,r,x), ts1);

这个函数应该return一个区间列表。例如。不可分割(3,[10,20,30], [2,4,6]) 将 return(目前)[[7..13], [17..23], [27..33]].

完成这项工作后,我将开始处理这些列表,找出这些区间中的哪些数字不能被 ts2.

中的任何数字整除

但就目前而言,我的问题在于我拥有的函数定义。 MakeInterval 的定义没有问题,我已经对其进行了测试。这是我在尝试定义 NotDivisible:

时收到的错误
stdIn:5.33-5.71 Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z -> 'Y
  operand:         (int -> int list) * 'X
  in expression:
    map ((fn x => MakeInterval <exp>),ts1)

我试过手动指定所有类型都无济于事。从逻辑上讲,一切对我来说都是有意义的,但显然这里有一个我没有理解的语法问题。

上面的问题是map的调用,函数是柯里化的

map : ('a -> 'b) -> 'a list -> 'b list;

所以,对括号做一点小改动:

fun NotDivisible(r, ts1, ts2) = map (fn x => MakeInterval(r,r,x)) ts1;

给你:

val NotDivisible = fn : int * int list * 'a -> int list list