2017-02-28 85 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 

雖然我不確定實際達到什麼。