2017-02-28 66 views
1

我试图确保与特质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

Funcfunc有签名:

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

里面Constfunc具有不同的签名:

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

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

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

虽然我不确定实际达到什么。