繁体   English   中英

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

[英]How to define a type of function with default value in Scala

这与这个问题略有不同。

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

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

  def checkInts(f: MyFunction)
}

是否可以? 如果是,我怎样才能做到这一点? 如果不是,为什么?

在这里阅读为什么你不能在匿名函数中使用默认参数以及如何制作类似的东西 - 在 Scala 中,你可以让匿名函数具有默认参数吗?

但是,如果您只需要一种方法来传递带有 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
}

到目前为止,根据我的知识,您无法定义具有默认参数的type 一个type就是一个type

你可以做的是定义一个部分应用的函数

以下面的函数为例:

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() 函数的一些但不是全部参数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM