我有以下枚举
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
}
但出于某种原因,我不能将类型参数用作函数(仅限于方法)。那我该怎么办?
答案 0 :(得分:1)
它没有很好的语法,但很多使用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)
,...),您需要大量的特征。
种类投影机插件实现了与自然变换相对应的certain kind of polymorphic lambda语法。这可能不会对您的用例有用,我只是指出这一点,以表明人们已经考虑扩展Scala语法以简化类型参数函数的抽象。