2017-09-02 101 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

太棒了!謝謝。有趣的是,這樣一個小小的錯誤能讓我回到幾個小時。 –

相關問題