SML错误:操作符和操作数不同意[tycon mismatch]

时间:2017-09-02 03:17:37

标签: sml smlnj

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

MakeInterval - 采用自然数 r ,(也用于 rp )和自然数 t ,并返回区间[tr,t + r]。

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

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

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

r 指定间隔的下限和上限(与 MakeInterval 相同),ts1是要输入 map <的数字列表/ em>使用MakeInterval函数。

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

此函数应返回间隔列表。例如。 NotDivisible(3,[10,20,30],  [2,4,6])将返回(现在)[[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)

我尝试手动指定所有类型无济于事。从逻辑上讲,一切对我都有意义,但显然这里存在一个我没有遵循的语法问题。

1 个答案:

答案 0 :(得分:1)

上面的问题是调用map,函数是curry

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