通用操作的高阶函数

时间:2017-04-27 17:57:28

标签: 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

我想对它们实现算术,关系和逻辑运算。在执行此操作时,可以优化明显的代码重复。 而不是做一些荒谬的模式匹配来做正确的操作格式。有没有办法做一个泛型函数,我可以在进行模式匹配时作为参数传递?鉴于在模式匹配中唯一改变大部分时间的是操作函数。

我已经知道你可以用这样的方法做泛型算术运算方法:

  def add[T](x: T, y: T)(implicit num: Numeric[T]): T = {
    import num._
    x + y
  }

但出于某种原因,我不能将类型参数用作函数(仅限于方法)。那我该怎么办?

1 个答案:

答案 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语法以简化类型参数函数的抽象。