从SML中的列表中删除重复项

时间:2014-01-12 16:39:07

标签: recursion functional-programming sml smlnj

我刚开始学习SML中的函数式编程,我想知道如何将以下两个函数组合成一个函数。函数isolate使用辅助函数'removed'删除任何类型列表('a)的重复项。

fun isolate [] = []
  | isolate (l as x::xs) = x::isolate(remove(x,xs))

fun remove (x,[]) = []
  | remove (x,l as y::ys) = if x = y then remove(x,ys) else y::remove(x,ys)

因此,为了更好地理解SML中的构造,如何在isolate中包含函数remove?这看起来似乎微不足道,但我已经考虑过了,无法弄明白。谢谢您的帮助!

4 个答案:

答案 0 :(得分:8)

一种方法是在remove内定义isolate

fun isolate [] = []
  | isolate (l as x::xs) =
      let fun remove (x,[]) = []
            | remove (x,l as y::ys) = if x = y
                                      then remove(x,ys)
                                      else y::remove(x,ys)
      in
        x::isolate(remove(x,xs))
      end

或者,为了使重复数据删除成为一个函数,尽管所有这些都是使用库函数List.filter执行与remove相同的操作。

fun isolate [] = []
  | isolate (x::xs) = x::isolate(List.filter (fn y => y <> x) xs)

答案 1 :(得分:1)

我的想法:定义一个嵌套函数来检查列表中是否有重复的元素:

fun set(nums:int list)=
  let fun duplicate(x:int, l:int list)=
    if null l
    then false
    else hd l=x orelse duplicate(x,tl l)
  in
      if null nums
      then []
      else
      let val s=set(tl nums)
      in if duplicate(hd nums,s)
         then s
         else hd nums::s
      end
  end

但它会给出一个列表,它只是每个重复元素的最后一个列表。

答案 2 :(得分:0)

我想提出以下这个问题的解决方案:

fun remove_duplicates(xs: int list) = 
    let
        fun check(xs: int list, item: int) =
            if null xs
            then false
            else if hd xs = item
            then true
            else check (tl xs, item)
        fun go_through_list(xs: int list) =
            if null xs
            then []
            else if check(tl xs, hd xs)
                 then go_through_list(tl xs)
                 else hd xs :: go_through_list(tl xs)
    in
        go_through_list(xs)
    end

与@qaphla提出的解决方案相比,它的代码行更多。

答案 3 :(得分:0)

我的想法是先对列表进行排序,然后递归返回一个没有重复项的新列表:

fun remove_duplicates(l: int list) =
if null(l)
then []
else if null(tl l)
then l
else
    let
        fun compare(x: int, y: int) = x > y
        fun sort(l: int list) = ListMergeSort.sort(compare) l
        val l_sorted = sort(l)
    in
        if (hd l_sorted) = (hd (tl l_sorted))
        then remove_duplicates(tl l_sorted)
        else (hd l_sorted)::remove_duplicates(tl l_sorted)
    end