斯卡拉。具有短语法的嵌套 lambda 的参数

标签 scala lambda functional-programming

拜托,对不起我的英语:( 让我们通过例子来解释我的问题。我们有一个数组a:

    var a = Array(1,1,1,1,2)

我们可以:

  1. 过滤a:

    a.filter( _ < 2 )
    
  2. 计算 a 中的一些元素:

    a.count (_ < 2)
    
  3. 获取集合中的独特元素:

    a.filter { i =>
        a.count(_ == i) == 1
    }
    

问题是:如何在不引入变量i的情况下做第三个子句?是否可以这样写:

    a.filter ( a.count ( _ == __) == 1 )

我知道我可以写这个(它仍然很短):

    a.filter { i => a.count(_ == i) == 1 }

但我只是对答案感兴趣。

最佳答案

如果不引入变量 i 就无法做到这一点,因为它需要混合来自两个不同范围的变量(即所谓的 closure )。如果我们在不使用 _ 占位符变量的情况下编写此代码,这将变得更加清晰。

a.filter( outer =>
  a.count( inner =>
    outer == inner
  ) == 1
)

对于 aouter 的每个值,我们正在创建一个新函数传递给 count,其中 outer 是常量,inner 作为参数传入。 _只能作为最内层函数的占位符,不能代替outer。这就是为什么

a.filter( outer =>
  a.count(
    outer == _
  ) == 1
)

编译但是

a.filter(
  a.count( inner =>
    _ == inner
  ) == 1
)

没有。

关于斯卡拉。具有短语法的嵌套 lambda 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916169/

相关文章:

algorithm - 找到除以haskell的阶乘的数字的最大幂

scala - 在Scala中如何将一个案例类转换为另一个不受代码更改字段添加影响的类?

functional-programming - React vs ReactX vs 函数式编程 vs 响应式(Reactive)函数式编程 vs 响应式(Reactive)扩展

scala - 不同的字节码生成问题

Java lambda 比匿名类慢 20 倍

c# - 我如何在内存列表中分组?

java - 如何使用 lambda 计算对象字段中的重复项?

haskell - 函数式编程语言中的 Church-Rosser 定理示例

scala - 转换 "hollow"更高种类的类型值以避免实例化

eclipse - 为 Scala IDE 配置 Lift 项目