gpt4 book ai didi

带有下划线的scala传递函数产生一个函数而不是一个值

转载 作者:行者123 更新时间:2023-12-03 23:15:11 24 4
gpt4 key购买 nike

您好,我正在编写将函数传递给 map 的任何可能的变体,我最初的理解是它们都会产生相同的结果,但我发现第 2、3 行实际上产生了不同的输出,第 4 行是个谜对我来说

def g(v: Int) = List(v - 1, v, v + 1)
val l = List(1, 2, 3, 4, 5)
// map with some variations
println(l.map { x => g(x) })
println(l.map { (_: Int) => g(_) }) // line 2
println(l.map { (_) => g(_) }) // line 3
println(l.map { _ => }) // line 4
println(l.map { g(_) })
println(l.map { g })

输出:

List(List(0, 1, 2), List(1, 2, 3), List(2, 3, 4), List(3, 4, 5), List(4, 5, 6))
List(<function1>, <function1>, <function1>, <function1>, <function1>)
List(<function1>, <function1>, <function1>, <function1>, <function1>)
List((), (), (), (), ())
List(List(0, 1, 2), List(1, 2, 3), List(2, 3, 4), List(3, 4, 5), List(4, 5, 6))
List(List(0, 1, 2), List(1, 2, 3), List(2, 3, 4), List(3, 4, 5), List(4, 5, 6))

最佳答案

这些都是将函数 g 的应用程序传递给 List 的每个元素的等效方法:

l.map { x => g(x) }
l.map { g(_) }
l.map { g }

res17: List[List[Int]] = List(List(0, 1, 2), List(1, 2, 3), List(2, 3, 4), List(3, 4, 5), List(4, 5, 6))

这些是将 List 的所有元素映射到 g 等未应用函数的等效方法:

l.map { (_: Int) => g(_) }
l.map { (_) => g(_) }

即映射列表的每个元素实际上都是g

scala> l.map { (_: Int) => g(_) }.head
res23: Int => List[Int] = <function1>
scala> res23(0)
res24: List[Int] = List(-1, 0, 1)

实际上,这两者之间的唯一区别是括号和类型注释。它们都等价于:

l.map { _ => g(_) }

下面只是将List的所有元素映射到Unit:

l.map { _ => }

关于带有下划线的scala传递函数产生一个函数而不是一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com