Scala:'课程需要抽象化。在实现更高阶函数时

时间:2017-02-28 10:39:11

标签: scala class traits

我试图确保具有特征Func的类(表示一些符号数学表达式)拥有一个将返回数字函数(实现符号表达式)的方法。

trait Func {
  def func[T](x: T): T=>Double
}

case class Const(d: Double) extends Func {
  def func[T]: (T=>Double) = (x: T)=>d
}

object Main extends App {
  val c = new Const(3.142)
  val cAt1 = c.func(1.0)
  println(s"c(1.0)=$cAt1") // expected: c(1.0)=3.142
}

这会返回以下错误:

[error] /projects/tutdiff/diff.scala:6: class Const needs to be abstract, since method func in trait Func of type [T](x: T)T => Double is not defined
[error] case class Const(d: Double) extends Func {
[error]            ^

我感兴趣的是funcConst的实施不符合要求的原因。但这也意味着一个类必须是抽象的(Scala的新东西)。

编辑:====================

这是我立即寻找的签名。

trait Func {
  def func[T]: T=>Double
}

case class Const(d: Double) extends Func {
  def func[T]: T=>Double = (x: T) => d
}

使用类型参数T应该是后续问题的主题。

1 个答案:

答案 0 :(得分:1)

func中的

Func有签名:

def func[T](x: T): T => Double

Const内,func有不同的签名:

def func[T]: (T => Double)

不再需要T类型的参数。也许你想要的是:

def func[T](x: T): (T => Double) = (x: T) => d

虽然我不确定实际取得了什么。