0

我在网上找到了这个使用foldl的成员函数

fun memeber3 (x,xs)=
              foldl (fn (y,b)=>b orelse x=y) false;

但是当我用一个元素和一个列表运行它时它不起作用,而不是 true 或 false 它的反应就像我正在编写一个新函数并打印出如下内容:

fn int 列表->布尔

有人可以向我解释上述函数如何找到一个元素是否属于一个列表以及如何正确执行它?

4

1 回答 1

1

我认为该函数应该被声明为:

fun memeber3 (x,xs)= foldl (fn (y,b)=>b orelse x=y) false xs

注意最后使用 xs ,在这种情况下,您可以通过这样做来使用它

val x = memeber3(1,[1,2,3])

或者它可以被声明为

fun memeber3 x = foldl (fn (y,b)=>b orelse x=y) false

在这种情况下使用柯里化:注意参数缺少括号和参数 xs。之所以如此,是因为 member3 和 fold 都期望一个列表作为它们的最后一个参数,因此我们可以避免声明它。这样,member3 实际上生成了一个新函数,需要一个列表 xs。

你可以像这样使用它:

val x = memeber3 1 [1,2,3]

注意不使用括号的调用。这是一个咖喱调用。

值得一提的是,在这里使用 fold 的问题是您必须遍历整个列表,即使您在第一次迭代中找到了要查找的元素。那是次优的解决方案。

我认为一旦你找到了你要找的东西,最好避免做更多的计算。有点像:

fun exists(e, xs) =
    case xs of
         [] => false
       | x::xs' => x = e orelse exists(e, xs')

此处 orelse 运算符的短路特性将避免在找到元素时调用 exists 的另一个迭代。

于 2013-10-08T16:00:39.953 回答