我刚开始学习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?这看起来似乎微不足道,但我已经考虑过了,无法弄明白。谢谢您的帮助!
答案 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