1

具体的な方法を例にとると、

def df(f: Float => Float, dt: Float) = (t: Float) => f(t + dt) - f(t)

コンパイルして動作させることができます。しかし、一般的な方法で定義しようとすると、

def df[T](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)

コンパイラは言った、

「エラー: タイプの不一致; 検出: T;必須: 文字列 def df[T](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)」 .

タイプ T を追加できなかったようです。それから私は別の方法を試しました、

def df[T <: Double](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)

またもや失敗、

scala> def df[T <: Double](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)
<console>:7: error: type mismatch;
 found   : Double
 required: T
       def df[T <: Double](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)
                                                             ^

これですべてのトリックが使い果たされました。

どうすれば作れますか?

4

2 に答える 2

2

あなたの最初の定義について:

def df[T](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)

これは、タイプ T に「+」メソッドがあるか「-」メソッドがあるかがわからないためではありません。

あなたの最初の定義は、

def df[T <: Double](f: T => T, dt: T) = (t: T) => f(t + dt) - f(t)

簡単な話 - から拡張することはできDoubleませ+T

これを一般的に行うには、すべての数値型に適用され、すべての数値演算子を宣言する統一特性が必要です。残念ながら、これは Scala には当てはまりません。しかし、次善のものがあります: 型クラス (情報については、この質問を参照してください: Scala の型クラスは何に役立ちますか? )。型クラスは暗黙を使用して Scala で実装されます。

あなたのための解決策は次のとおりです。

def df[T](f: T => T, dt: T)(implicit num: Numeric[T]) = (t: T) => num.minus(f(num.plus(t, dt)), f(t))

メソッドは汎用的ですが、型のオブジェクトに対して などnumを実行する方法を認識しplus、暗黙的に渡されるオブジェクトの存在も必要とします。幸いなことに、Scala ライブラリはすべてのプリミティブ数値型 Int、Double などのインスタンスを提供しているため、その必要はありません。minusTNumeric

後で編集:

Jesper Nordenberg と Régis Jean-Gilles が指摘しているように、実際にはインポートを使用して最初の式を取得できます。

def df[T](f: T => T, dt: T)(implicit num: Numeric[T]): (T => T) = {
  import num._
  (t: T) => f(t + dt) - f(t)
}

これは、暗黙的な変換も使用して実現されます。Numeric何が起こっているかの詳細については、ソース ファイルを確認できます: Numeric.scala

ただし、注意が必要です。このソリューションは、主にボクシングが原因で、重い数学的計算を行っている場合にパフォーマンスの問題が発生する可能性があります。

それが役に立てば幸い !

于 2013-02-22T15:08:05.213 に答える
1

に存在する保証がないt + dtため、任意の型に対して行うことはできません。実際、ほとんどの型はを定義していません。T+T+

また、サブクラスT <: Doubleのメソッドはを返し、に渡す必要があるため、は機能しません。+DoubleDoublefT

今、あなたはおそらく一般的な数学を行う方法を探しています-つまり、あなたに渡された正確な数値タイプを無視します。Scalaでこれを行うのは簡単ではありません。特に、パフォーマンスも必要な場合はそうです。最近はもっと効率的なアプローチがありますが、私のこの古い質問にアクセスできます。効率が必要な場合は、 Spireをご覧ください。

于 2013-02-22T15:02:51.803 に答える