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

上一篇: Parameter type inference in scala

下一篇: how scala infer method's parameterss