3

我有一个带有函数列表的案例类:

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

我定义了 20 多个函数。其中一些函数有自己的参数,其中一些还使用案例类中的qrs值。两个例子是:

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

问题是我在实例化案例类时需要引用qr和两次: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!

实现这一目标的最佳技术是什么?我可以在案例类扩展的特征中定义我的函数吗?

编辑:现实世界的应用程序有 7 个成员,而不是 3 个。只有少数功能需要访问成员。大多数功能都不关心它们。

4

3 回答 3

5

如果qinf2 总是qin you case class,那么一个快速破解:

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)))

否则,f2需要对 A 的引用this,如果它是类 A 的成员或 A 的特定实例,它将具有该引用。部分问题是在实例化 A 的实例之前函数已完全烘焙。所以你必须f2在 A 的上下文中定义,而不是简单地实例化它。

最后,您可以将函数设为部分函数。第一组参数将保持原样,但将添加第二组 A 类型。

于 2010-05-18T19:37:16.597 回答
1

一个简单的想法是将函数更改为获取一个包含 3 个双精度数(q、r 和 s)的函数列表,并将函数从双精度数返回到双精度数。这样,那些需要任何值的函数都可以使用它们,而其他函数则忽略它们。

于 2010-05-18T19:10:15.197 回答