从ml列表中删除元素

时间:2013-08-17 17:49:11

标签: sml ml

我正在尝试编写一个函数,该函数生成一个包含给定列表而没有元素x的新列表。

莫斯科ML表示有些案件在这场比赛中未被使用。

fun delete (x,list) = delete(x,[])
 |delete(x,(first::rest)) = if first = x then delete(x,rest) else first::delete(x,rest)

3 个答案:

答案 0 :(得分:1)

以下是我在Standard ML ::

上的表现
fun delete (item, list) =
    case list of
    []=>[]
      | xs::ys => if item = xs then delete(item,ys)
          else xs::delete(item,ys)

不使用案例:

fun delete (item, list) = List.filter(fn x => x <> item) list

没关系多重等号。

答案 1 :(得分:1)

当执行对delete的调用时,(基本上)按顺序尝试定义该函数的模式。由于第一个模式已匹配每个列表,因此永远不会达到第二个模式。这就是编译器抱怨的原因。

换句话说,您要么必须重新排序案例,要么更好,使它们不相交(例如,在第一种情况下将list替换为[])。

额外提示:第一种情况的右侧似乎也是错误的。这将永远进入无限递归。

答案 2 :(得分:1)

那是因为你的第一个案例与任何列表相匹配,所以第二种情况永远不会被使用。
请记住,案例是按照他们编写的顺序进行审核的,而不是根据最佳&#34;最佳&#34;匹配。

还有一个无限递归的问题
delete (x,list) = delete(x,[])

由于list将匹配[],因此它将永远递归 如果从空列表中删除某些内容,则结果应为空列表。

你可以做两件事之一。

首先移动非空案例:

fun delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)
  | delete (x, list) = []

或者,更常见的是,使第一种情况仅匹配空列表:

fun delete (x, []) = []
  | delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)