如何在通话时编写自动类型解析的通用方法?

gre*_*man 1 generics types scala

假设我有功能:

def foo[A,B](a : A, f : A => B) = ... 
Run Code Online (Sandbox Code Playgroud)

我称之为:

var x = new X()
foo(x, obj => ...
Run Code Online (Sandbox Code Playgroud)

此时很明显lambda(obj here)的参数类型是X(例如,C#以这种方式工作).

但是在Scala我必须写:

foo(x, (obj : X) => ...
Run Code Online (Sandbox Code Playgroud)

它会在代码中引起很多噪音.

如何编写我的函数foo以避免每次调用都出现过度规范?或者也许我错过了一些东西并且需要添加类型,因为这样的调用(没有类型信息)将是不明确的.

Rex*_*err 6

把函数写成

def foo[A,B](a: A)(f: A => B) = ...
Run Code Online (Sandbox Code Playgroud)

代替.Scala将每个参数列表视为一组约束来解决从左到右的移动,并且可能过于谨慎地进行简化假设(例如,类型A可能是X您编写它的方式的超类).如果使用单独的参数列表,则可以打破推理.此外,它使通常在语法上更好的用法:

foo(x) { y =>
  // Block of code dealing with y
}
Run Code Online (Sandbox Code Playgroud)

  • @macias - 你错误地认为泛型类型可以起作用.`foo(x,(y:Any)=> 2)`完全有效,而'A`是'Any`. (2认同)