2011-12-19 90 views
1

如何删除列表L中的元素elem?如果列表不包含elem,那么函数应该返回列表不变。SML:从列表中删除条目

例如:

L = [1, 3, 4, 0, 5, 7]  
elem = 5 

到目前为止,我有以下功能:

fun removeElem elem myList[] = myList 
    | removeElem (myList::tl) = if mem myList elem then 
           rm elem myList[] 
           else 
           removeElem elem tl 

回答

3

您可以扭转的问题,并询问如何只保留不等于elem这些项目。这与filter干净适合:

fun removeElem elem myList = filter (fn x => x <> elem) myList 
0

此代码将完成你想做的事:删除元素(实际上它会删除该元素的所有实例,如果有不止一个)并返回列表的其余部分原样:

fun remove_element (list, element) = 
    case list of 
    [] => [] 
     | list_head::list_tail => let val a = remove_element(list_tail, element) 
         in 
          if list_head = element 
          then a 
          else list_head::a 
         end 
0
fun delete (s,[])  = [] 
    | delete (s,x::xs') = 
    if s = x then xs' (* more efficient than call delete function again *) 
    else x::delete(s, xs') 
+1

你能解释一下这个代码是如何工作没有图书馆或额外的功能呢? – 2013-08-24 23:38:51

+0

这只会删除元素的第一个出现。 – 2013-08-26 07:47:00

+0

如果我想删除一个真实元素,该怎么办?我应该添加什么来做到这一点? – zeeks 2015-11-03 12:37:36

0
fun remove_element (elemlist, elem) = 
    case elemlist of 
    [] => [] 
    | head::tail => if elem = head 
        then remove_element (tail, elem) 
        else head::remove_element (tail, elem) 

输出SML/NJ:

val remove_element = fn : ''a list * ''a -> ''a list 
val it =() : unit 
(* matching *) 
- remove_element ([1,2,3,4,5], 4); 
val it = [1,2,3,5] : int list 
(* non matching *) 
- remove_element ([1,2,3,4,5], 7); 
val it = [1,2,3,4,5] : int list 
(* multiple instances *) 
- remove_element ([1,3,4,4,5],4); 
val it = [1,3,5] : int list 
-2

你也可以使用此功能从列表中删除重复项:

fun remove_duplicates(xs: ''a list) = 
    let 
     fun helper(ds: ''a list, m: ''a) = 
      if null ds 
      then [] 
      else if hd ds = m 
      then helper(tl ds, m) 
      else hd ds :: helper(tl ds, m) 
    in 
     if null xs 
     then [] 
     else hd xs :: remove_duplicates(helper(tl xs, hd xs)) 
    end 
+2

我不认为这个问题是关于删除重复,只是某个元素。 – matsjoyce 2014-10-26 11:16:09

0

随着

fun remv(L, c) = 
    if null(L) then nil 
    else if c=hd(L) then remv(tl(L), c) 
    else hd(L)::remv(tl(L), c);