3

関数のリストを受け取るケースクラスがあります。

case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double])

20以上の関数を定義しています。これらの関数の一部には独自のパラメーターがあり、一部の関数はcaseクラスの、、、および値qr使用します。s2つの例は次のとおりです。

def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double, q:Double) = (d:Double) => d * q * w

問題は、ケースクラスをインスタンス化するときに、、、およびを2回q参照rする必要があることです。s

A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0, 0.5))) //0.5 is referenced twice

次のようにクラスをインスタンス化できるようにしたいと思います。

A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0))) //f2 already knows about q!

これを達成するための最良のテクニックは何ですか?ケースクラスが拡張する特性で関数を定義できますか?

編集:実際のアプリケーションには、3つではなく7つのメンバーがあります。メンバーにアクセスする必要がある関数はごくわずかです。ほとんどの関数はそれらを気にしません。

4

3 に答える 3

5

qinf2 が常にqin youを参照している場合case class、1 つの簡単なハック:

trait TraitA {                                                                                       
  def q:Double                                                                                       
  def r:Double                                                                                       
  def s:Double                                                                                       

  def f1(w:Double) = (d:Double) => math.sin(d) * w                                                   
  def f2(w:Double) = (d:Double) => d * q * w                                                         
}                                                                                                    

case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double]=Nil) extends TraitA              

val a=new A(0.5, 1.0, 2.0){override val l= List(f1(3.0), f2(4.0))}                                   
于 2010-05-18T19:52:45.797 に答える
3

明白な val 宣言があります:

val a = 0.5
A(a, 1.0, 2.0, List(f1(3.0), f2(4.0, a)))

それ以外の場合は、クラス A のメンバーまたは A の特定のインスタンスである場合f2に A's への参照が必要thisです。問題の一部は、A のインスタンスがインスタンス化される前に関数が完全にベイクされることです。したがってf2、単にインスタンス化するのではなく、A のコンテキストでを定義する必要があります。

最後に、関数を部分関数にすることができます。パラメータの最初のグループはそのままですが、タイプ A の 2 番目のグループが追加されます。

于 2010-05-18T19:37:16.597 に答える
1

簡単なアイデアの 1 つは、関数を変更して、3 つの double (q、r、および s) を受け取り、double から double への関数を返す関数のリストを取得することです。そうすれば、値のいずれかを必要とする関数はそれらを使用でき、他の関数はそれらをすべて無視します。

于 2010-05-18T19:10:15.197 に答える