我认为函数应该被声明为:
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 的另一个迭代。