scala中的参数类型推断

scala中的参数类型推断

问题描述:

给定一个具有两个类型参数的函数,是否可以在scala中为单个类型传递类型参数,例如只需提供类型A作为类型B可以由编译器从函数fscala中的参数类型推断

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

Partially applying type parameters

+0

谢谢您的回答,我会再深入这个方向,看我是否可以使用类,而不是功能。 –