2013-06-03 74 views
1

我想创建一个功能g,需要一个功能f作为参数,其中f有一个类型参数。我无法获得编译的g的签名。一种尝试是这样的:传递函数参数类型作为参数

scala> def mock1[A](): A = null.asInstanceOf[A] // STUB 
mock1: [A]()A 

scala> def mock2[A](): A = null.asInstanceOf[A] // STUB 
mock2: [A]()A 

scala> def g0(f: [A]() => A): Int = f[Int]() 
<console>:1: error: identifier expected but '[' found. 
     def g0(f: [A]() => A): Int = f[Int]() 
       ^

我可以得到它,如果我换行,需要一个类型参数的特质,像这样的功能工作:

scala> trait FWrapper { def f[A](): A } 
defined trait FWrapper 

scala> class mock1wrapper extends FWrapper { def f[A]() = mock1[A]() } 
defined class mock1wrapper 

scala> class mock2wrapper extends FWrapper { def f[A]() = mock2[A]() } 
defined class mock2wrapper 

scala> def g(wrapper: FWrapper): Int = wrapper.f[Int]() 
g: (wrapper: FWrapper)Int 

scala> g(new mock1wrapper) 
res8: Int = 0 

有没有一种方法可以让我完成这没有介绍包装类?

回答

5

Scala并(目前)没有对多态函数值的支持。你有两个选择:

  1. 坚持自己的包装特征(可能比较容易理解),从Shapeless
  2. 使用多态函数值(花哨,但也许有点复杂)
0

如何:

def mock[A](): A = null.asInstanceOf[A] 

    def g[A](f:() => A): A = f() 

    g(mock[Int]) 
+0

谢谢,但没有按”工作。我的例子被过分简化了。我需要能够在'g'的主体内使用不同类型的参数来调用'f'。例如,像'DEF克(F:[A]()=> A):布尔= {F [字符串]()== F [INT]()的toString。}'。 –