标签: scala-placeholder-syntax

Scala下划线 - 错误:缺少扩展函数的参数类型

我知道这方面有很多问题,但我创造了一个我认为应该有用的简单例子,但仍然没有,我不确定我理解为什么

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 scala-placeholder-syntax

82
推荐指数
1
解决办法
3万
查看次数

管理下划线以定义匿名函数的规则是什么?

_用作占位符来创建匿名函数,问题是我无法预测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

8
推荐指数
1
解决办法
1188
查看次数

Scala强调用于简化函数文字的语法

我有以下代码:

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

5
推荐指数
1
解决办法
3145
查看次数

在Scala中,使用下划线制作闭包的规则是什么?

起初我曾相信使用下划线来制作闭包(例如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 scala-placeholder-syntax eta-expansion

3
推荐指数
1
解决办法
99
查看次数

为什么 ((_: Int, _: Int) =&gt; _ / _) 当 ((_: Int) / (_: Int)) 不编译?

我正在学习 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我很确定这种推理存在缺陷。我只是不确定缺陷是什么。

scala scala-placeholder-syntax

3
推荐指数
1
解决办法
104
查看次数

我发现Scala的下划线不一致

这有效: (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)

它是不一致的,因为在第一种情况下,匿名函数(_+_)成功编译,但第二种情况失败.

有没有我错过或误解的东西?或者只是语法定义?

lambda scala anonymous-function scala-placeholder-syntax

1
推荐指数
1
解决办法
131
查看次数

下划线导致困难

我有以下代码,它应该搜索数组并查看是否与第二个参数匹配.

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

0
推荐指数
1
解决办法
190
查看次数