我正在编写一个使用一个列表作为事件的函数。然后该函数获取此列表并从其他列表中删除所有出现的内容。
例如:
[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;
答案 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)代替第一个函数。