scala中的参数类型推断
给定一个具有两个类型参数的函数,是否有可能在scala中为单个类型传递类型参数,例如在示例中仅提供类型A
,因为编译器可以从函数f
推断出类型B
def foo[A, B](f: A => B): B = {
f(null.asInstanceOf[A])
}
现在,我发现只有两个解决方案。
解决方案1(标准用法):调用foo
并指定两个类型foo[String, Int]( e => 1)
但Int
的定义是多余的
解决方案2:将函数的定义更改为
def foo[A, B](useType: A => Unit)(f: A => B): B = {
f(null.asInstanceOf[A])
}
并与它一起使用
def use[T](t: T) = {}
val res: Int = foo(use[String]) { a => 1 }
它可以工作,但使用函数向编译器提供类型似乎不是很漂亮。
有没有什么办法可以为一个函数指定类型A
,只需要两个类型参数?
一般来说,在Scala中不能部分应用类型参数。 无论是在方法上还是在课堂上。 一些包装可以使用:
def myMethod[A, B]() = ???
def myMethod1[A0, W <: Wrapper { type A = A0 }]() = ???
trait Wrapper {
type A
type B
}
也许有一些路径依赖类型:
def myMethod1[A0, W <: Wrapper { type A = A0 }](w: W)(): w.B = ???
如果不是方法而是类,则有类型lambdas和类型成员的方法(类型成员可以部分应用:对于trait Wrapper { type A; type B }
Wrapper { type A = A0 }
trait Wrapper { type A; type B }
是类似Wrapper[A0, _]
的存在类型Wrapper[A0, _]
为trait Wrapper[A, B]
)。
部分应用类型参数
链接地址: http://www.djcxy.com/p/38029.html