【问题标题】:Member function in sml with foldl带有 foldl 的 sml 中的成员函数
【发布时间】:2013-10-09 00:18:57
【问题描述】:

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

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

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

fn int 列表 ->bool

谁能给我解释一下上面的函数如何判断一个元素是否属于一个列表以及如何正确执行它?

【问题讨论】:

    标签: function member sml fold


    【解决方案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-01-17
      • 1970-01-01
      • 2021-09-20
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多