函数仅删除列表

时间:2015-10-05 12:14:07

标签: sml smlnj

我正在编写一个使用一个列表作为事件的函数。然后该函数获取此列表并从其他列表中删除所有出现的内容。

例如:

  

[1,2,3]应从[3,2,1,2,3,1,2,3]中移除,给我们[3,2]

     不应该以我获得空列表[]

的方式删除

[1,2,3]

到目前为止,我已经删除了其中一个,但它不会删除其他任何内容。

这是我的功能:

fun deleteAll l1 [] = []
  | deleteAll l1 (hd::tl) =
      if starts l1 (hd::tl)
      then (deleteAll l1 tl; delete l1 (hd::tl))
      else [hd]@deleteAll l1 tl;

以下是其中使用的其他功能:

fun starts [] l2 = true
  | starts l [] = false
  | starts (h1::t1) (h2::t2) = (h1=h2) andalso (starts t1 t2);

fun delete l1 [] = []
  | delete l1 (hd::tl) =
      if starts l1 (hd::tl)
      then List.drop(hd::tl, length l1)
      else [hd]@delete l1 tl;

1 个答案:

答案 0 :(得分:1)

在做类似的高级操作之前,首先要实现一个更简单的案例,即一个将删除给定元素的每一个出现的函数。 此后,您可以使用此功能作为工具来实现下一个功能,即删除一个列表中出现的每个元素。

我恳请你运用自己的想法而不去看解决方案。以下是更多详细信息:SML List Deletion

解决方案:

关于第一个,您可以这样做:

fun del e [] = []
  | del e (h::t) =
      if e=h
      then del e t
      else h :: (del e t);

关于第二个,你将这样实现:

fun delete _ [] = []
  | delete [] l2 = l2
  | delete (h1::t1) t2 = delete t1 (del h1 t2);

或者,您也可以使用内置函数(如filter)代替第一个函数。