2017-02-13 6 views
0

を倍増するタイプのパラメータを変換:Scalaは、私はこのクラスが定義されている

type MLMatrix[T] = Array[Array[T]] 

は今、別のクラスでは、私は、オブジェクトLinearEquationsを作成してい

class LinearEquations[T <% Double](var y: MLVector[T],var rows: MLMatrix[T]) { 
def largestPivot(p: Int): Int = { 
    var pivot = rows(p)(p).abs //Error here: value abs is not a member of type parameter T 
    //more code 
} 

(MLMatrixはダブルスで満たされていると仮定) :

var rows = new MLMatrix[Double](4)//now fill with Doubles 
val le = new LinearEquations(y, rows) 

暗黙的な変換がいくつかありますが、その方法はわかりません。コンストラクタは型パラメータを受け取りますが、クラスをインスタンス化するときにはDoubleを渡します。事前に

おかげで、

+2

問題の[MCVE]を投稿してください。 'y'と'行 'とは何ですか?それらはどこで作成されますか?また、ビューの境界は推奨されません。 –

+0

かなりのステートメントと質問はありません。質問するのはどうですか?間違いはありますか?何が問題ですか? – pedrofurla

+0

私が書いたことを読むのはどうですか?エラーは表示されませんか?値absは型パラメータTのメンバではありませんT – MLeiria

答えて

0

これを試してみては:

class LinearEquations[T <% Double](var y: Array[Array[T]], var rows: Array[Array[T]]) { 
    def largestPivot(p: Int): Int = { 
     var pivot = rows(p)(p) //Error here: value abs is not a member of type parameter T 
     val res: Double = scala.math.abs(pivot) 
     //more code 
     0 
    } 
    } 

それは私のためにコンパイル

+0

これは動作しますが、私はそれを行うよりスケーラな方法を探していました。ありがとう – MLeiria

+0

Spireオープンソースの数学プロジェクトをチェックしてみるとよいでしょう: https://github.com/non/spire 一般的な数学のための良いコードがたくさんあります。私はそれを自分で使い、それに満足しています。 –

2

コード:

10.0.abs 

RichDoublePredef内で定義された型に暗黙的な変換のおかげで動作します:

@inline implicit def doubleWrapper(x: Double) = new runtime.RichDouble(x) 

しかし、コンパイラは、という理由だけで理由のいくつかのケースでDoubleようTを扱うことができません。

しかし、この問題の解決策があります。型クラス:これは簡単にあなたが使用したいすべての可能Tのための新しい暗黙を提供することにより、拡張することができ

trait MathsOps[T] { 

    def abs(num: T): T 
} 

implicit object DoubleOps extends MathOps[Double] { 
    def abs(num: Double) = num.abs 
} 

class LinearEquations[T : MathsOps](var y: MLVector[T], var rows: MLMatrix[T]) { 
def largestPivot(p: Int): Int = { 
    var pivot = implicitly[MathOps[T]].abs(rows(p)(p)) 
    //more code 
} 

。これは、あなたがLinearEquationsに合格することができます任意の数値タイプのために働く必要があります

implicit class RichMathSyntax[T : MathOps](value: T) { 

    def abs = implicitly[MathOps[T]].abs(value) 
} 

:あなたは別の暗黙のクラスを定義することができ、構文を復元するに

+0

これは私が探していたものです。素晴らしい答え!ありがとう。 – MLeiria

関連する問題