2016-11-13 69 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))更昂贵,但对于小例子来说它并不重要,甚至可能稍微好一点,因为它会避免颠倒列表的最后一步。