2017-02-27 65 views
4

我有代碼看起來像這樣:如何編寫Scala中的類型類?

/** 
    * A divisor that operates on real numbers. 
    */ 
case class RealDivisor(divisor: Long) 
    extends Divisor[Double, Double] 
    with Divisor[Long, Double] // ... with Divisor[Int, Double], etc. 
    { 

    override def divide(dividend: Double): Double = 
    if (divisor != 0) dividend/divisor.toDouble else 0 

    def divide(dividend: Long): Double = divide(dividend.toDouble) 

} 

我寧願能夠做這樣的事情:

case class RealDivisor(divisor: Long) extends Divisor[A: Numeric] { 
    // ... 
} 

因此我只需要一次實現divide方法。我會如何做這樣的事情?

+0

'數字'不會有太大的幫助,因爲它沒有實現分割。但是,如果您按照「Numeric」作爲指南,您會發現許多這些實例不是免費的。你真的在找什麼?是否可以通過其他數字類型來劃分「Long」,還是將任何數字類型除以任何數字類型的能力? –

+1

[這個問題](http://stackoverflow.com/questions/40351176/generic-numeric-division)可能是有益的。 – jwvh

+0

@MichaelZajac我希望能夠將類型轉換爲「Double」,以便我可以對其進行劃分;這就是爲什麼我使用'Numeric'。 –

回答

0

你在找什麼是field的想法。

A Field typeclass由例如, Spire

+0

我不想用另一個相同的數據類型尋找一個數據類型的劃分。對不起,如果我的例子令人困惑。 –

+0

雖然你不知道,但我確定你是。真正的道路是Field和投影到你想要在分割之前/之後使用的數據類型。 – Apocalisp

+0

我看到'abstract def div(x:A,y:A):A'--絕對不是我想要的。 –