2016-11-13 33 views
1

我試圖寫在SML一個函數,它給出的一般元素的列表時,重新排序其元素爲等價類,並返回這些類(類型「列表,列表)的列表。 離開在相同的順序類的元素以原始列表。 給定函數定義的元素的等價,如果元素是等價的或否則爲false返回true。 我似乎無法得到解決一握。分區列表爲等價類

fun sample x y = x = y 

所需類型:FN:( '' 一 - > '' 一 - > BOOL) - > '' 的列表 - > '' 列表列表

非常感謝您的幫助。

助手功能不能正常工作,所有我想用它做的是看看給定元素屬於任何類,並把它內。因此或創建一個包含一個新的子表。當由11

測試劃分

fun srt listoflists func new = 
     case listoflists of [] => [[]] 
     | a::b => if func (new, hd a) = true then (new::a)::b 
        else if func (new, hd a) = false then a::(srt b func new) else [new]::a::b 

樣品功能檢查兩個元件的等價是不是所有的工作,它不加入17進入一個新的類。

srt [[7,7,7],[5,5,5],[11,11,11],[13,13,13]] eq 7; 
val it = [[7,7,7,7],[5,5,5],[11,11,11],[13,13,13]] : int list list 
- srt [[7,7,7],[5,5,5],[11,11,11],[13,13,13]] eq 5; 
val it = [[7,7,7],[5,5,5,5],[11,11,11],[13,13,13]] : int list list 
- srt [[7,7,7],[5,5,5],[11,11,11],[13,13,13]] eq 11; 
val it = [[7,7,7],[5,5,5],[11,11,11,11],[13,13,13]] : int list list 
- srt [[7,7,7],[5,5,5],[11,11,11],[13,13,13]] eq 13; 
val it = [[7,7,7],[5,5,5],[11,11,11],[13,13,13,13]] : int list list 
- srt [[7,7,7],[5,5,5],[11,11,11],[13,13,13]] eq 17; 
val it = [[7,7,7],[5,5,5],[11,11,11],[13,13,13],[]] : int list list 
- srt [[7,7,7],[5,5,5],[11,11,11],[13,13,13],[111,111,111]] eq 111; 
val it = [[7,7,7],[5,5,5],[11,11,11],[13,13,13],[111,111,111,111]] 

如何糾正這一點,也曾經這個輔助功能的工作原理,如何準確encorporate成所需的主要功能。

非常感謝。

+0

您能否提供一些輸入和期望輸出的具體示例列表? –

+1

你可以從編寫一個幫助器函數開始,該函數接受一個列表和一個新元素以及布爾值函數,並且將新元素附加到列表中的適當列表(如果它是相當於其中一個列表中的元素),或者啓動一個僅包含該項目的新列表,並將此新列表添加到列表列表中。爲了提高效率,將新項目附加到列表的* front *中,並在返回列表之前使整個函數反轉列表(使用內置的「rev」)。 –

+0

謝謝約翰。我試圖想出一個幫助函數的解決方案,但它不能正常工作。 – user911

回答

1

您的示例代碼看起來像你越來越接近,但有幾個問題

1)基礎的情況就是new應該加入,所以在這種情況下,你應該返回值[[new]]而非[[]]

2)你的問題說明表明,func''a -> ''a -> bool類型,但你的srt代碼似乎是假設它是(''a * ''a) -> bool類型。而不是像func (new, hd a)的子表達式,你需要func new (hd a)(注意括號的位置)。

3)如果func的回報,而不是if func new (hd a) = true then ...一個bool然後輸出比較true是不必要的繁瑣,只需if func new (hd a) then ...

4)由於要添加在基礎情況下[new],你的第二句話是不必要的冗長。我看到沒有理由有任何嵌套if表達式。

因爲這似乎是家庭作業,我不想多說。一旦你得到幫助程序正常工作,它應該是相當直接的使用它(在遞歸情況下)的整體功能。請注意,如果您希望避免在最終返回值之間需要最終映射rev,則可以使用(a @ [new])::b而不是(new::a)::b@::(它是O(n)而不是O(1))更昂貴,但對於小例子來說它並不重要,甚至可能稍微好一點,因爲它會避免顛倒列表的最後一步。