2011-10-29 66 views
2

我想我希望它是'列表*'類型列表 - >'列表。爲什麼我的功能鍵入'列表*'列表 - >'B列表?

相交應返回兩個列表 樣本的輸入和輸出的交集:

  • 交點([1],[1]);
    • [1]
  • 交點([1,2,3],[1,2]);
    • [1,2]
  • 交點([[2,3],[1,2],[2,3]],[[1],[2,3]]);
    • [2,3]

我的功能:

fun intersection (l1, l2) = let 
    fun intersection_acc (acc, [], h::t) = [] 
     | intersection_acc (acc, h::t, []) = [] 
     | intersection_acc (acc, h::t, h2::t2) = if in_list (h, l2) 
      then intersection_acc (h::acc, t, l2)  
     else intersection_acc (acc, t, l2) 
    in intersection_acc ([], l1, l2) 
end 

我不認爲in_list的問題,但是這看起來是這樣的:

fun in_list (x, []) = false 
    | in_list (x, y::r) = if x = y 
    then true 
    else in_list (x, r); 
+3

你爲什麼標記此作爲matlab?這顯然是一些ML變體,而不是matlab。我在猜SML? – sepp2k

+0

對不起,我沒有意識到有什麼不同。我認爲這是SMLNJ。 – Nate

+3

@Nate:ML與matlab無關。 ML是一種功能語言,MatLab勢在必行。 –

回答

3

我的猜測是你在你的累加器函數中剔除了基本情況

intersection_acc (acc, h::t, []) = [] 

應該根據acc可能返回的東西:

intersection_acc (acc, h::t, []) = acc 

的原因'b list顯示出來是因爲路口總是返回空列表[]。由於您不使用空列表,因此編譯器需要保守,並說列表可以是任何類型。


在任何情況下,您的功能似乎基本上更困惑。你真的想這樣做

result = [] 
for each item in list1: 
    if item in list2: 
     add item to result 
return result 

翻譯這個命令性代碼的遞歸函數的蓄電池參數:

fun go(acc, []) = acc 
    | go(acc, x::xs) = 
     if x in list2 then 
      go(x::acc, xs) 
     else 
      go(acc, xs) 

對於全功能:

fun intersect(list1, list2) = let 
    fun go(acc, []) = acc 
     | go(acc, x::xs) = 
      if x in list2 then 
       go(x::acc, xs) 
      else 
       go(acc, xs) 
    in go([], list1) 
+0

關於我的基本情況,您絕對正確。我在腦海中對此感到困惑。 你的功能比我的還好。我最初將intersection_acc設置爲一個累加器函數,它與包含三個參數的元組相交(與獨立於交集的工作無關),但沒有想到要去掉元組中不需要的(並且不變的)第二個列表。 非常感謝! – Nate

相關問題