gpt4 book ai didi

Scala - 在映射函数中与 lambda 混淆

转载 作者:行者123 更新时间:2023-12-05 09:20:11 24 4
gpt4 key购买 nike

我正在学习 Scala 并在命令行中进行试验。我无法理解为什么第二行无法编译。有人可以解释一下吗。

val list = List(1,2,3,4)
list.map(_+1) //This works. List(2,3,4,5)
list.map(List(_+1)) //But, Compilation Fails here
list.map(x=>List(x+1)) //This works. List(List(2),List(3),List(4),List(5))

谢谢。

最佳答案

Scala 会将 _(在占位符位置使用时)扩展为 x => x,除非这种扩展会导致恒等函数(更多信息请参见这个答案的结尾):

list.map(_+1)       // same as list.map(x => x + 1)       (1)
list.map(List(_+1)) // same as list.map(List(x => x+1)) (2)

(1) 的情况下,scala 可以推断出 x 的类型为 Int(因为 list: List[Int ]).
但是 (2) 失败了

error: missing parameter type for expanded function ((x$1) => x$1.$plus(1))

因为 scala 无法推断 xList(x => x+1) 中的类型。


关于扩展和恒等函数:

scala> list.map(List(_))
res3: List[List[Int]] = List(List(1), List(2), List(3), List(4))

有效,因为 list.map(List(x => x)) 扩展被拒绝,下一个可能的是 list.map(x => List(x) ),它给出 res3

关于Scala - 在映射函数中与 lambda 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38615221/

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