假设我有功能:
def foo[A,B](a : A, f : A => B) = ...
我称之为:
var x = new X()
foo(x, obj => ...
此时很明显lambda(obj here)的参数类型是X(例如C#就是这样的。)
但是在Scala我必须写:
foo(x, (obj : X) => ...
它会在代码中引起很多噪音。
如何编写我的函数foo以避免每次调用都出现这种过度规范?或者也许我错过了一些东西并且需要添加类型,因为这样的调用(没有类型信息)将是不明确的。
答案 0 :(得分:6)
将函数写为
def foo[A,B](a: A)(f: A => B) = ...
代替。 Scala将每个参数列表视为一组约束来解决从左到右移动的问题,并且可能过于谨慎地进行简化假设(例如,A
的类型可能是X
的超类,就像你的方式一样写了)。如果使用单独的参数列表,则可以打破推理。此外,它使用通常在语法上更好:
foo(x) { y =>
// Block of code dealing with y
}
答案 1 :(得分:1)
我认为一般来说是讨好的方法,但如果你有很多具有相同类型参数的函数,你可以这样做:
class Foo[T] {
def apply[R](x: T, f: T => R) = f(x)
}
val foo = new Foo[Int]
foo(10, x => "Result: " + x.toString) // String = Result: 10
foo(10, x => x.toString * 5) // String = 1010101010
foo(42, x => x + 100) // Int = 142
foo(12, x => Seq.iterate(x, 5)(_*2)) // Seq[Int] = List(12, 24, 48, 96, 192)