我知道这方面有很多问题,但我创造了一个我认为应该有用的简单例子,但仍然没有,我不确定我理解为什么
val myStrings = new Array[String](3)
// do some string initialization
// this works
myStrings.foreach(println(_))
// ERROR: missing parameter type for expanded function
myStrings.foreach(println(_.toString))
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么第二个语句不编译?
我_用作占位符来创建匿名函数,问题是我无法预测Scala将如何转换我的代码.更确切地说,它错误地确定了我想要的"大"匿名函数的大小.
List(1,2,3) foreach println(_:Int) //error !
List(1,2,3) foreach (println(_:Int)) //work
List(1,2,3) foreach(println(_:Int)) //work
Run Code Online (Sandbox Code Playgroud)
使用-Xprint:typer我可以看到Scala将第一个转换为"一个大的匿名函数":
x$1 => List(1,2,3) foreach(println(x$1:Int))
Run Code Online (Sandbox Code Playgroud)
工作的第2个3号是正确的转变成我想要的.
... foreach (x$1 => println(x$1:Int))
Run Code Online (Sandbox Code Playgroud)
为什么这个?规则是什么?
lambda scala anonymous-function partial-application scala-placeholder-syntax
我有以下代码:
var x = Array(1,3,4,4,1,1,3)
var m = Int.MaxValue
x.foreach((x)=>(m = m min x))
Run Code Online (Sandbox Code Playgroud)
我试图将最后一句简化为:
x.foreach((m = _ min m))
Run Code Online (Sandbox Code Playgroud)
但口译员说:
scala> x.foreach((m = _ min m))
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.min(m))
x.foreach((m = _ min m))
^
Run Code Online (Sandbox Code Playgroud)
我试图更明确地说明这种类型:
scala> x.foreach((m = (_:Int) min m))
<console>:8: error: type mismatch;
found : (Int) => Int
required: Int
x.foreach((m = (_:Int) min m))
^
Run Code Online (Sandbox Code Playgroud)
编译器和我彼此不了解:(
最好的祝福,
斯坦
syntax lambda scala function-literal scala-placeholder-syntax
起初我曾相信使用下划线来制作闭包(例如println _)只是使用箭头的简写(例如x => println x),但我最近才知道你也可以做以下事情:
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce(f _)
Run Code Online (Sandbox Code Playgroud)
鉴于我过去的假设,f _看起来像一个闭包,它只接受一个参数并且只传递一个参数f.我以为它会告诉我它无法编译因为f需要两个参数,并且reduce应该期望一个带有两个参数的函数.但是就像我写的那样:
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce((x, y) => f(x, y))
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?使用下划线创建闭包的规则是什么?
我正在学习 Scala 并且有一个非常基本的问题。考虑使用占位符语法的以下两个表达式 -
// Syntax A
val fnA = (_: Int, _: Int) => _ / _
// Syntax B
val fnB = (_: Int) / (_: Int)
Run Code Online (Sandbox Code Playgroud)
以及他们尝试的应用——
// Syntax A
fnA(33, 3)
// Syntax B
fnB(33, 3)
Run Code Online (Sandbox Code Playgroud)
在这两个中,只有 B 和 App(B) 是有效的语法,我不知道为什么。如果编译器能够推断参数(以及应用它们的顺序),fnB为什么它不能为fnA?我的问题是基于fnB一个简写的前提,fnA我很确定这种推理存在缺陷。我只是不确定缺陷是什么。
这有效: (1 to 5).reduceLeft( _+_ )
但这不是: (x:Int,y:Int)=>_+_
<console>:8: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
(x:Int,y:Int)=>_+_
^
<console>:8: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
(x:Int,y:Int)=>_+_
^
Run Code Online (Sandbox Code Playgroud)
它是不一致的,因为在第一种情况下,匿名函数(_+_)成功编译,但第二种情况失败.
有没有我错过或误解的东西?或者只是语法定义?
我有以下代码,它应该搜索数组并查看是否与第二个参数匹配.
def any(check: Set[Any], expr: Boolean): Boolean = {
var checked = check.filter(_ => expr)
if (checked == Set())
return false
else
return true
}
Run Code Online (Sandbox Code Playgroud)
它应该被称为这样:
any(Set(3, 4, 5, 6), _ > 5)
但是当我打电话给它时:
error: missing parameter type for expanded function ((x$1) => x$1.$greater(5))
Run Code Online (Sandbox Code Playgroud)
我对函数式语言和Scala的经验很少,所以,请给我一个彻底的解释,说明发生了什么以及如何解决它!
lambda functional-programming scala set scala-placeholder-syntax