【发布时间】:2017-05-11 13:27:16
【问题描述】:
我确信应该存在这样的东西,但我只是不知道如何表达它。
那么有没有办法定义一个通用函数,它可以接受任意数量的任何类型的参数(从零开始)并返回一个已知类型的值?所以如果我们定义
f: <something_here> => Int
任何返回Int 的函数都应该满足这个要求。
【问题讨论】:
标签: scala function types parameters
我确信应该存在这样的东西,但我只是不知道如何表达它。
那么有没有办法定义一个通用函数,它可以接受任意数量的任何类型的参数(从零开始)并返回一个已知类型的值?所以如果我们定义
f: <something_here> => Int
任何返回Int 的函数都应该满足这个要求。
【问题讨论】:
标签: scala function types parameters
不,没有,但不会失去类型安全性(假设我正确理解了您的问题)。最终,使用类型值的唯一方法例如String => Int 是为其apply 方法提供String,但是您怎么知道要为“返回Int 的任何函数”提供什么类型的参数?
如果你愿意失去类型安全(你不应该),你可以用类似的东西来实现它
class UnsafeFunction[A] {
def apply(xs: Any*): A
}
object UnsafeFunction {
implicit def fromF1[A, B](f: A => B): UnsafeFunction[B] = new UnsafeFunction[B] {
def apply(xs: Any*) = f(xs(0).asInstanceOf[A])
}
implicit def fromF2[A, B, C](f: (A, B) => C): UnsafeFunction[C] = new UnsafeFunction[C] {
def apply(xs: Any*) = f(xs(0).asInstanceOf[A], xs(1).asInstanceOf[B])
}
...
}
这允许将返回Int 的任何函数分配给UnsafeFunction[Int] 类型的值,或将其传递给接受此类参数的方法。同样,我非常不建议在实践中使用它。
您可以有用的是使用泛型类型,例如A => Int 和(A, B) => Int,其中A 是您的类型或方法的类型参数。 Scala 本身不允许您统一具有不同数量参数的函数,但有一个库可以做到这一点:Shapeless。不幸的是,使用它绝非易事。
【讨论】:
我认为这样做可以:
def f[T](x:T*): Int = ???
它接受任意数量的T 类型的参数并返回Int。在函数中,您可以访问变量x 为Seq[T],因此可以相应地处理参数。
但您可能想要定义 T 类型的上限,具体取决于您想对它们做什么。
【讨论】:
您可以编写一个函数,它可以将Any 作为参数,并将 Int 作为返回类型
例如
def f(x: Any*) : Int = x.length
上面的函数接受任意数量的任意类型的参数并返回传递的参数数量 你可以执行它 -
f(1,2,3) // This will return 3
f(1,'b') // This will return 2
希望这能澄清你的疑问!
【讨论】: