我在互联网上找到了这个使用 foldl
的成员函数fun memeber3 (x,xs)=
foldl (fn (y,b)=>b orelse x=y) false;
但是当我使用元素和列表运行它时它不起作用,而不是真或假,它会像我正在编写一个新函数一样反应并打印出类似这样的内容:
fn int list - > bool
有人可以向我解释一下,如果一个元素属于某个列表,以及如何正确执行它,上述函数如何找到?
答案 0 :(得分: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
在这种情况下使用currying:注意参数缺少括号和缺少参数xs。这是因为member3和fold都希望列表作为它们的最后一个参数,因此我们可以避免声明它。这样,member3实际上生成了一个期望列表xs的新函数。
你可以像这样使用它:
val x = memeber3 1 [1,2,3]
注意不使用括号的调用。这是一个咖喱的调用。
值得一提的是,这里使用折叠的问题是,即使您在第一次迭代中找到了您要查找的元素,也必须遍历整个列表。这是次优的解决方案。
我认为一旦找到了你想要的东西,最好避免做更多的计算。有点像:
fun exists(e, xs) =
case xs of
[] => false
| x::xs' => x = e orelse exists(e, xs')
如果找到元素,这里的orelse运算符的短路特性将避免调用exists的另一个迭代。