所以这是我的问题:我想创建一个带有list和int的函数,然后递归遍历列表,如果它在列表中找到一个等于int的元素,那么它应该返回整个删除了元素的列表,以及表示删除了某些内容的布尔值。这是我到目前为止所得到的:
fun foo ([], n) = ([],false)
| foo ((x::xs), n) = if x = n
then (xs,true)
else ([x] @ foo(xs,n),false);
我的想法是让函数在元组中包含所需的元素,如下所示:
([x0] @ [x1] @ [x2] @ [xs], true)
那么有什么方法可以实现这个功能吗?请记住,一旦它击中等于n的元素,它必须停止,但仍保留列表的其余部分,并能够返回布尔值。运行时间是关键。
答案 0 :(得分:2)
您当前的代码在逻辑上接近正确,但正如您所知,它不会因[x] @ foo (xs, n)
而进行类型检查。 foo
返回一个无法直接追加的元组。以下是修复方法:
fun foo ([], n) = ([], false)
| foo (x::xs, n) = if x = n
then (xs, true)
else let val (xs', tf) = foo (xs, n) in (x::xs', tf) end
需要let
从元组中提取列表,并找出列表尾部是否找到n
。然后我们简单地将元组重新组合在一起,并将x
consed重新放回到前面。