scala中的参数类型推断

时间:2017-10-16 11:40:30

标签: scala types

给定具有两个类型参数的函数,scala中是否可以为单个类型传递类型参数,例如,在示例中仅提供类型A,因为类型B可以由函数f编译。

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类型?

1 个答案:

答案 0 :(得分:1)

通常不会,在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