Functional programming 查找SML NJ是否存在重复项

Functional programming 查找SML NJ是否存在重复项,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我想编写一个函数来搜索列表,并查找列表中是否有重复的值。该函数应返回布尔值。我就在这里,但这不起作用 fun myFunc [] = true myFunc(x::xs) = if(x=myFunc(xs)) then false else myFunc(xs); [1,2,2,3,4,5,6] should return true [1,2,3,4,5,6,7] should return false [1,2,3,4,5,6,1] should return true 谢谢 正如@Ma

我想编写一个函数来搜索列表,并查找列表中是否有重复的值。该函数应返回布尔值。我就在这里,但这不起作用

fun myFunc [] = true
myFunc(x::xs) = 
if(x=myFunc(xs)) then false
else myFunc(xs);

[1,2,2,3,4,5,6] should return true
[1,2,3,4,5,6,7] should return false
[1,2,3,4,5,6,1] should return true

谢谢

正如@Marcin在评论中所说,一种简单有效的方法是使用set检查重复。SML/NJ在中有许多集合结构可用

关于函数,您无法比较
x
myFunc-xs
,因为它们可能不具有相同的类型。空列表是没有重复的列表(
myFunc[]
应返回
false

这项工作:

fun duplicated [] = false
  | duplicated (x::xs) = (List.exists (fn y => x = y) xs) orelse (duplicated xs)

然而,最坏情况下的时间复杂度是O(n2)(
n
是列表的长度),这是非常低效的。

您意识到SML/NJ支持集合吗?不,我的意思是您可以使用集合来检测列表是否包含重复项。实际上我刚刚解决了问题,这正是我所做的。非常感谢。出于兴趣,为什么不是一个基于集合的解决方案呢?有时我想,如果。。。然后是真的,否则…:)@AndreasRossberg:我希望惩罚能小到再编辑一次:)。