【问题标题】:Scala underscore explanationScala下划线解释
【发布时间】:2016-06-03 04:49:54
【问题描述】:

看看这些 scala sn-ps: 如果我们有这样的事情:

List(List(1, 2), List(3, 4), List(5)) map (x => (x.size))

我们可以将其缩短为:

List(List(1, 2), List(3, 4), List(5)) map ((_.size))

但是,如果我们有这样的事情:

List(List(1, 2), List(3, 4), List(5)) map (x => (x.size, x.size))

为什么我们不能把它缩短为:

List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size))

?

【问题讨论】:

  • 有趣的问题,我会留在这里检查答案

标签: scala functional-programming tuples


【解决方案1】:

占位符的数量应该等于函数参数的数量。在您的情况下,map 有 1 个参数,这就是您不能使用两个占位符的原因。

【讨论】:

  • 请给我一个例子,我可以在表达式的右侧以 map ((_.size, _.size)) 结尾。
  • @GA1 您不能在 map 方法中使用 2 个占位符。 2 个占位符 List(1,2,3,4).reduce(_ + _) 的使用示例 - 总和列表元素。
  • 无论如何,我真的很喜欢这个问题的答案stackoverflow.com/questions/25763400/… 尤其是与语言学有关的部分。我还是不明白为什么编译器不允许:List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size)) 它的底层原理是什么?这个功能会带来什么“危险”?
  • @GA1 List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size)) 会做什么? map 接受 List[Int] 类型的一个操作数。
  • @GA1 在 Scala 中没有办法做到这一点。这不是为了“危险”;这是由于 _ 如何用于函数速记。每个参数的正文中只能使用一次下划线。要获得 (_.size, _.size) 的等价物,您必须使用完整的函数签名或映射到 _.size 并将结果列表转换为具有重复条目的元组。
【解决方案2】:

因为List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size))有不同的含义,即

List(List(1, 2), List(3, 4), List(5)) map ((x => x.size, y => y.size))

(您可以从错误消息中看到这一点)。这显然无法编译,因为map 不接受两个函数的元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 2019-09-21
    • 2021-07-04
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多