scala中的参数类型推断
问题描述:
给定一个具有两个类型参数的函数,是否可以在scala中为单个类型传递类型参数,例如只需提供类型A
作为类型B
可以由编译器从函数f
。scala中的参数类型推断
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 = ???
而且在没有方法,但类有类型lambda表达式和类型成员的办法的情况下(类型成员可以是部分应用:Wrapper { type A = A0 }
对于trait Wrapper { type A; type B }
是存在型,如Wrapper[A0, _]
对于trait Wrapper[A, B]
)。
谢谢您的回答,我会再深入这个方向,看我是否可以使用类,而不是功能。 –