2011-12-19 63 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);