2011-12-05 71 views
0

我正在爲類進行SML編程確認並卡在一個問題上。問題是: 「編寫一個使用map,foldr或foldl的ML函數來計算非空列集合的交集。在這裏你可以假設集合被表示爲列表。對於這個問題,你可以使用輔助命名函數(例如,isMember)提示:非空的集合列表至少包含一個集合。「SML使用map,foldr或foldl函數設置交叉點

這就是我到目前爲止任何人都可以指向正確的方向我對SML相當陌生嗎?

fun member(x,[]) = false 
| member(x,L) = 
     if x=hd(L) then true 
     else member(x,tl(L)); 

fun intersect(L1,L2) = if tl(L1) = [] then L1 
else if member(hd(L1),L2) = true then L1 
else intersect(tl(L1),L2); 

fun combine(L1) = if tl(L1) = [] then hd(L1) 
else 
    foldr intersect [] L1; 

我想要的代碼是通過執行列表的列表的組合功能開始。它檢查是否只有一個列表(即t1(L1)= []),如果它是真的,那麼就打印第一個列表。如果它的假我想調用然後調用相交函數的foldr函數。理論上,在foldr函數期間,我希望它檢查第一個列表和第二個列表,並且只保留相同的值,然後檢查下一個列表以保留值,並保持這樣做直到它檢查了每個列表。完成之後,我希望它打印每個列表中的每個值(即集合的交集)。

我知道我的成員函數的工作原理及功能結合起來做什麼它應該做的,我的問題是,什麼是錯的交集功能,有人可以解釋什麼交集應該做的事?

我明顯不想直接回答,這不是我在這裏。我需要幫助才能獲得正確的答案。

+1

你有一個具體的問題?你期望這個代碼做什麼,它實際上做了什麼? –

+1

你還沒有問過一個具體的問題。 –

回答

0

這是我的工作答案!

fun member(x,[]) = false 
| member(x,L) = 
     if x=hd(L) then true 
     else member(x,tl(L));  

fun intersect([],[]) = [] 
| intersect(L1,[]) = [] 
| intersect(L1,L2) = if member(hd(L2), L1) then hd(L2)::intersect(L1, tl(L2)) 
    else intersect(L1, tl(L2)); 

fun combine(L1) = if L1 = [] then [] 
else if tl(L1) = [] then hd(L1) 
else foldr intersect (hd(L1)) (tl(L1)); 

這裏有一些測試用例運行。

combine([[1,2],[1,3],[1,4]]); 
val it = [1] : int list 
combine([[1,2,3],[1,8,9,3],[1,4,3,8,9]]); 
val it = [1,3] : int list 
combine([[1,2,3,8,9],[1,8,9,3],[1,4,3,8,9]]); 
val it = [1,3,8,9] : int list 
3

你的membercombine功能看起來不錯,但你需要更仔細地考慮通過intersect函數。對於初學者來說,如果L1是一個空列表,它會發出異常,因爲tl不能在空列表上操作。想想你需要擔心的三種情況:

  • L1是零
  • hd(L1)L2
  • hd(L1)L2

找出你需要在每個做什麼案件並從那裏去。