SML: удалить запись из списка - PullRequest
1 голос
/ 19 декабря 2011

Как мне удалить элемент elem в списке L?Если список не содержит elem, функция должна вернуть список без изменений.

Например:

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

Ответы [ 7 ]

3 голосов
/ 19 декабря 2011

Вы можете перевернуть вопрос и спросить, как оставить только те элементы, которые не равны elem.Это соответствует чисто с filter:

fun removeElem elem myList = filter (fn x => x <> elem) myList
0 голосов
/ 22 апреля 2019

Вы можете попробовать этот код.

fun remove_element (elemlist:int list, elem:int) = 
  case elemlist of
  [] => []
  | head::tail => if elem = head
                  then remove_element (tail, elem)
                  else head::remove_element (tail, elem)
0 голосов
/ 17 февраля 2016

Без библиотек и дополнительных функций

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);
0 голосов
/ 26 октября 2014

также вы можете использовать эту функцию для удаления повторяющихся записей из списка:

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
0 голосов
/ 17 октября 2014
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
0 голосов
/ 25 августа 2013
fun delete (s,[])     = []
  | delete (s,x::xs') = 
    if s = x then xs' (* more efficient than call delete function again *)
    else x::delete(s, xs') 
0 голосов
/ 27 января 2013

Этот код выполнит то, что вы хотите сделать: удалить элемент (фактически он удалит все экземпляры элемента, если их более одного) и вернет остальную часть списка как есть:

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
...