scala - 参数只出现一次,但不能简化为下划线

时间:2017-11-26 22:38:08

标签: scala arguments simplify

在我写的一个简单的实验函数之一

  def check[T](xs: Seq[T])(pred: T => Boolean): Boolean = xs.forall { x =>
    try {
      pred(x)
    } catch {
      case e: Exception => false
    }
  }

我只是想看看它是否可以简化为

  def check[T](xs: Seq[T])(pred: T => Boolean): Boolean = xs.forall {
    try {
      pred(_)
    } catch {
      case e: Exception => false
    }
  }

如果没有try - catch block,可以按照以下方式完成

def check[T](xs: Seq[T])(pred: T => Boolean): Boolean = xs.forall {
    pred(_)
}

我有点困惑为什么try-catch块使参数显式

2 个答案:

答案 0 :(得分:1)

根据下划线的规则,

try {
  pred(_)
} catch {
  case e: Exception => false
}

装置

try {
  x => pred(x)
} catch {
  case e: Exception => false
}

因此trycatch分支的类型不匹配。并且创建x => pred(x) lambda肯定不会抛出异常(除非你内存不足)。

答案 1 :(得分:0)

  def check[T](xs: Seq[T])(pred: T => Boolean): Boolean = xs.forall {
    try {
      pred(_)
    } catch {
      case e: Exception => _ => false
    }
  }

将编译。因此,根据规范6.22,异常处理程序返回类型符合forall方法。