Scala:泛型函数上的匹配大小写

Scala:泛型函数上的匹配大小写,scala,Scala,是否可以对函数执行匹配case? 我想为不同类型的函数定义一个行为。假设我有以下几种可能性: f:T=>Int f:T=>String f:T=>Lis[Int] f:T=>Boolean f:T=>Double 对于每个选项,我都有一个函数;例如,对于Int输出: def doThisForInt(f:T=>Int)={…} 对于Boolean输出: ` def doThisForBoolean(f:T=>Boolean)={…} 现在假设给出了一个函数定义:valf=(输入:T)=

是否可以对函数执行
匹配case
? 我想为不同类型的函数定义一个行为。假设我有以下几种可能性:

  • f:T=>Int
  • f:T=>String
  • f:T=>Lis[Int]
  • f:T=>Boolean
  • f:T=>Double
对于每个选项,我都有一个函数;例如,对于
Int
输出:

def doThisForInt(f:T=>Int)={…}
对于
Boolean
输出: ` def doThisForBoolean(f:T=>Boolean)={…}

现在假设给出了一个函数定义:
valf=(输入:T)=>true
。我们应该选择对应的大小写
f:T=>Boolean

请注意,所有这些函数的输出类型不同。或者,给定
f
我可以获取此函数的输出类型吗?

是您需要的:

import scala.reflect.runtime.universe._

def doThisForInt(f: T => Int) = ???

def printType[R: TypeTag](f: T => R) = typeOf[R] match {
  case t if t =:= typeOf[Int] =>
    val toInt: (T) => Int = f.asInstanceOf[T => Int]
    doThisForInt(toInt)
  case t if t =:= typeOf[Double] =>
    // ...
  case t if t =:= typeOf[List[Int]] =>
  // ...
}

printType((x: T) => 1) // int
printType((x: T) => 2.0) // double
printType((x: T) => List(2)) // list
正如你所看到的,这是可能的,但不是非常优雅和反对

instanceOf检查链通常可以用虚拟方法替换(请参见),函数的结果类型可能是一个类型参数。在不了解更多用例上下文的情况下,很难给出更多建议。

是您想要的:

import scala.reflect.runtime.universe._

def doThisForInt(f: T => Int) = ???

def printType[R: TypeTag](f: T => R) = typeOf[R] match {
  case t if t =:= typeOf[Int] =>
    val toInt: (T) => Int = f.asInstanceOf[T => Int]
    doThisForInt(toInt)
  case t if t =:= typeOf[Double] =>
    // ...
  case t if t =:= typeOf[List[Int]] =>
  // ...
}

printType((x: T) => 1) // int
printType((x: T) => 2.0) // double
printType((x: T) => List(2)) // list
正如你所看到的,这是可能的,但不是非常优雅和反对


instanceOf检查链通常可以用虚拟方法替换(请参见),函数的结果类型可能是一个类型参数。如果不了解您的用例的更多上下文,就很难给出更多建议。

您的用例是什么?听起来类型类更适合这种情况,因为一个巨大的匹配/案例是一种代码味道?像一个用于
f:T=>Int
,一个用于
f:T=>Double
,等等?要使用匹配的方法的签名是什么?它不会接受
t=>Int
,因为您希望它是泛型的,对吗?类似于:
def doSomething[T,R](f:T=>R):?应该返回什么?您的用例是什么?听起来类型类更适合这种情况,因为一个巨大的匹配/案例是一种代码味道?像一个用于
f:T=>Int
,一个用于
f:T=>Double
,等等?要使用匹配的方法的签名是什么?它不会接受
t=>Int
,因为您希望它是泛型的,对吗?类似于:
def doSomething[T,R](f:T=>R):?应该退还什么?