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

时间:2011-11-12 16:27:47

标签: generics scala types

假设我有功能:

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

2 个答案:

答案 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)