我正在尝试编写一个函数,该函数生成一个包含给定列表而没有元素x的新列表。
莫斯科ML表示有些案件在这场比赛中未被使用。
fun delete (x,list) = delete(x,[])
|delete(x,(first::rest)) = if first = x then delete(x,rest) else first::delete(x,rest)
答案 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)