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以避免每次调用都出现过度规范?或者也许我错过了一些东西并且需要添加类型,因为这样的调用(没有类型信息)将是不明确的.
把函数写成
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)