0

所以这是我的问题:我想创建一个接受一个列表和 int 的函数,然后它递归地在列表中移动,如果它在列表中找到一个等于 int 的元素,那么它应该返回整个列表元素被移除,一个布尔值表示是否移除了某些东西。这是我到目前为止得到的:

fun foo ([], n) = ([],false)
  | foo ((x::xs), n) = if x = n 
                       then (xs,true)
                       else ([x] @ foo(xs,n),false);

我的想法是使函数 cons 成为元组中所需的元素,如下所示:

([x0] @ [x1] @ [x2] @ [xs], true)

那么有什么办法可以实现这个功能吗?请记住,一旦遇到等于 n 的元素,它就必须停止,但仍保留列表的其余部分,并能够返回布尔值。运行时间是关键。

4

1 回答 1

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在列表的尾部找到。然后我们简单地将元组与xconsed 一起放回前面。

于 2012-09-21T20:26:42.267 回答