SML“('a list * int) - >('a list,boolean)”

时间:2012-09-21 20:16:29

标签: list tuples sml

所以这是我的问题:我想创建一个带有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的元素,它必须停止,但仍保留列表的其余部分,并能够返回布尔值。运行时间是关键。

1 个答案:

答案 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重新放回到前面。