2017-09-02 50 views
1

我是新来的SML,并不完全理解我的问题,虽然我确定我有错。首先,这里是我测试的两个简短功能及其描述。SML错误:操作符和操作数不一致[tycon不匹配]

MakeInterval - 注意到的自然数- [R,(也可用于RP)和自然数,并返回的时间间隔[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)将返回[7,8,9,10,11,12,13]。如果您有建议要摆脱rp,请告诉我。这是我能够想到的唯一方法,在保持排序顺序的同时跟踪原始值r

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

- [R指定区间的下界和上界,(同MakeInterval)和TS1是号码的列表被送入地图与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

与上面的问题是图的调用,功能是咖喱

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 
+0

太棒了!谢谢。有趣的是,这样一个小小的错误能让我回到几个小时。 –

相关问题