【发布时间】:2018-02-11 02:28:32
【问题描述】:
我是 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);
例如MakeInterval(3,3,10) 将返回 [7,8,9,10,11,12,13]。如果您有摆脱 rp 的建议,请告诉我。这是我能想到的在保持排序顺序的同时跟踪 r 的原始值的唯一方法。
NotDivisible - 接受一个自然数 r、一个自然数列表 ts1 和另一个自然数列表 ts2时间>。尚未编写使用 ts2 的代码。
r 指定区间的下限和上限,(与 MakeInterval 相同),ts1 是要输入 map 带有 MakeInterval 函数。
fun NotDivisible(r, ts1, ts2) =
map (fn x => MakeInterval(r,r,x), ts1);
这个函数应该返回一个区间列表。例如。不可分割(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)
我尝试手动指定所有类型,但无济于事。从逻辑上讲,一切对我来说都是有意义的,但显然这里有一个我没有关注的语法问题。
【问题讨论】: