如何在Scala中定义具有默认值的函数类型

时间:2015-09-12 02:12:33

标签: scala types

这与this question略有不同。

我想定义一个定义了默认值的函数类型。 像这样:

trait Foo {
  type MyFunction = (Int, Option[Int] = 0) => Boolean

  def checkInts(f: MyFunction)
}

有可能吗?如果是,我怎样才能实现这一目标?如果没有,为什么?

2 个答案:

答案 0 :(得分:3)

在这里阅读为什么你不能在匿名函数中使用默认参数以及如何使类似的东西 - In Scala, can you make an anonymous function have a default argument?

但是如果你只需要一种方法来传递一个带有2或1个参数的函数,你总是可以使用更简单的方法:

trait Foo {
  type MyFunc1 = (Int) => Boolean
  type MyFunc2 = (Int, Int) => Boolean

  def checkInts(f: MyFunc1)
  def checkInts(f: MyFunc2)
  // common code of checkInts could be in some private method
}

答案 1 :(得分:2)

根据我的知识到目前为止,您无法使用默认参数定义typetypetype

您可以做的是定义部分应用的功能

以下列函数为例:

scala> def factorOf(x: Int, y: Int) = y % x == 0
factorOf: (x: Int, y: Int)Boolean

如果要在不保留任何参数的情况下使用函数的快捷方式,可以使用通配符运算符(_)赋值

scala> val f = factorOf _
f: (Int, Int) => Boolean = <function2>

scala> val x = f(7, 20)
x: Boolean = false

如果要保留某些参数,可以使用通配符运算符代替其中一个参数来部分应用该函数。此处的通配符运算符需要显式类型,因为它用于生成具有声明的输入类型的函数值:

scala> val multipleOf3 = factorOf(3, _: Int)
multipleOf3: Int => Boolean = <function1>

scala> val y = multipleOf3(78)
y: Boolean = true

新函数值multipleOf3是一个部分应用的函数,因为它包含factorOf()函数的一些但不是所有参数。

部分应用函数的更简洁方法是使用具有多个参数列表的函数。这是一种技术 称为currying功能:

scala> def factorOf(x: Int)(y: Int) = y % x == 0
factorOf: (x: Int)(y: Int)Boolean

scala> val isEven = factorOf(2) _
isEven: Int => Boolean = <function1>

scala> val z = isEven(32)
z: Boolean = true