Scala 泛型运算的高阶函数
我有下面的枚举Scala 泛型运算的高阶函数,scala,Scala,我有下面的枚举 sealed trait DataTyp case class IntN(n: Int) extends DataTyp case class FltN(n: Float) extends DataTyp case class StrL(d: String) extends DataTyp case class Bool(b: Boolean) extends DataTyp 我想在它们上面实现算术、关系和逻辑运算。在执行此操作时,存在明显的代码重复,可能会进行优化。 而不是为
sealed trait DataTyp
case class IntN(n: Int) extends DataTyp
case class FltN(n: Float) extends DataTyp
case class StrL(d: String) extends DataTyp
case class Bool(b: Boolean) extends DataTyp
我想在它们上面实现算术、关系和逻辑运算。在执行此操作时,存在明显的代码重复,可能会进行优化。
而不是为了正确的操作格式而进行大量的模式匹配。有没有一种方法可以在进行模式匹配时作为参数传递泛型函数?假设在模式匹配中,在大多数情况下唯一改变的是运算函数
我已经知道,你可以用这样的方法进行一般算术运算:
def add[T](x: T, y: T)(implicit num: Numeric[T]): T = {
import num._
x + y
}
但由于某些原因,我不能将类型参数用作函数(仅在方法上)。那么我能做些什么呢?虽然没有很好的语法,但它使用了scala在
A=>B
中使用的相同技巧:使用特征
trait MyGenericOperation {
def add[T](x: T, y: T)(implicit num: Numeric[T]): T = {
import num._
x + y
}
}
您还可以进一步抽象:
trait GenFunctionTTTWithTC[TC[_]] {
def apply[T: TC](x: T, y: T): T
}
请注意,要转换所有可能的高阶签名([A,B](A,B)=>A)
,[A,B](A,B)=>B)
,[A,B,C](A,B)=>C)
,…),您需要大量的特征
kind projector插件实现了对应于自然转换的语法。这可能对您的用例没有用处,我只是指出这一点,以表明人们考虑扩展Scala语法以简化对类型参数函数的抽象。您能否详细说明“但由于某些原因,我不能将类型参数用作函数(仅用于方法)。”?我的意思是如何将上面写的方法传递给函数调用。如果我不能定义接受类型参数函数的高阶函数。