Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 泛型运算的高阶函数_Scala - Fatal编程技术网

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

您能否详细说明“但由于某些原因,我不能将类型参数用作函数(仅用于方法)。”?我的意思是如何将上面写的方法传递给函数调用。如果我不能定义接受类型参数函数的高阶函数。