带有foldl的sml中的成员函数

时间:2013-10-08 15:26:03

标签: function member sml fold

我在互联网上找到了这个使用 foldl

的成员函数
fun memeber3 (x,xs)=
              foldl (fn (y,b)=>b orelse x=y) false;

但是当我使用元素和列表运行它时它不起作用,而不是真或假,它会像我正在编写一个新函数一样反应并打印出类似这样的内容:

  

fn int list - > bool

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

1 个答案:

答案 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的另一个迭代。