1

我有一个在 Scala 中使用 foldLeft 的方法。

def bitSetToByte(b:collection.BitSet, sh:Int=0) = 
  ((0 /: b) {(acc, input) => acc + (1 << (input - sh))}).toByte

该方法有两个用于匿名函数的参数,因此我通过删除形式参数将其替换为 _。

def bitSetToByte(b:collection.BitSet, sh:Int=0) = ((0 /: b) {(_ + (1 << (_ - sh))}).toByte

问题是我有类型不匹配错误消息。

在此处输入图像描述

可能有什么问题?

4

2 回答 2

4

在解释_时,编译器假定_对应的匿名函数包含在最近的括号集中(除了(_))。基本上,编译器解释(_ - sh)(x => x - sh),然后抱怨,因为您将函数传递给<<它预期的Int.

于 2014-06-04T18:51:58.743 回答
0

首先,你搞砸了括号。我猜你的意思是(toByte为了简洁起见,我也删除了)

def bitSetToByte(b:collection.BitSet, sh:Int) = 
  (0 /: b) { (_ + (1 << (_ - sh))) }

-Xprint:typer其次,typer 是你的朋友,你可以通过运行带有标志的 scala 解释器来了解你的代码在编译器的 typer 阶段之后的样子

def bitSetToByte(b: scala.collection.BitSet, sh: Int): Int = {
  <synthetic> <artifact> val x$1: Int = 0;
  b./:[Int](x$1)(((<x$2: error>: <error>) => <x$2: error>.<$plus: error>(1.$less$less(((x$3) => x$3.$minus(sh))))))
}

lambda 表达式可以简化为

{ x2 => x2 + (1 << (x3 => x3 - sh)) }

这不是你想要的

于 2014-06-04T19:01:42.127 回答