Generics 如何编写调用时自动类型解析的泛型方法?

Generics 如何编写调用时自动类型解析的泛型方法?,generics,scala,types,Generics,Scala,Types,假设我有一个函数: def foo[A,B](a : A, f : A => B) = ... 我称之为: var x = new X() foo(x, obj => ... 在这一点上,很明显lambda(这里的obj)的参数类型是X(例如C#就是这样工作的) 然而,在Scala中,我必须写: foo(x, (obj : X) => ... 它会在代码中产生大量噪音 问题 如何编写我的函数foo以避免每次调用都出现这种过度规范?或者可能我缺少了一些东西,需要添加类型,

假设我有一个函数:

def foo[A,B](a : A, f : A => B) = ... 
我称之为:

var x = new X()
foo(x, obj => ...
在这一点上,很明显lambda(这里的obj)的参数类型是X(例如C#就是这样工作的)

然而,在Scala中,我必须写:

foo(x, (obj : X) => ...
它会在代码中产生大量噪音

问题 如何编写我的函数foo以避免每次调用都出现这种过度规范?或者可能我缺少了一些东西,需要添加类型,因为这样的调用(没有类型信息)会有歧义。

将函数编写为

def foo[A,B](a: A)(f: A => B) = ...
相反。Scala将每个参数列表视为一组从左向右移动的约束条件,并且可能对简化假设过于谨慎(例如,
a
的类型可能是
X
的超类)。如果使用单独的参数列表,可能会破坏推理。此外,它还支持通常在语法上更好的用法:

foo(x) { y =>
  // Block of code dealing with y
}
将函数写为

def foo[A,B](a: A)(f: A => B) = ...
相反。Scala将每个参数列表视为一组从左向右移动的约束条件,并且可能对简化假设过于谨慎(例如,
a
的类型可能是
X
的超类)。如果使用单独的参数列表,可能会破坏推理。此外,它还支持通常在语法上更好的用法:

foo(x) { y =>
  // Block of code dealing with y
}

我认为咖喱一般来说是一种方法,但是如果你有很多函数具有相同类型的参数,你可以这样做:

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)

我认为咖喱一般来说是一种方法,但是如果你有很多函数具有相同类型的参数,你可以这样做:

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)

谢谢你们,我并没有把你们的答案标记为解决方案(现在),因为也许有人会不加修饰地给出答案——用简短的lambdas,它看起来“奇怪”:-)A不能是X的超类,它是泛型类型参数,所以它是X。@macias-关于泛型类型可以工作的问题,你们错了
foo(x,(y:Any)=>2)
是完全有效的,这里
A
Any
。这是因为Function1的签名是
trait Function1[-T1,+R]
,这表明T1是逆变的(我想…)@Rex Kerr,不,你明确地写了类型,我的意图是相反的——跳过它。在这种情况下,类型A应该是第一个参数中给出的类型。@Luigi Plinge,你是对的,你能重新发布你的评论作为答案吗?谢谢。谢谢你,我并没有把你的答案标记为解决方案(还没有),因为也许有人会不加修饰地给出答案——用简短的lambdas,它看起来“奇怪”:-)A不能是X的超类,它是泛型类型参数,所以它是X。@macias-关于泛型类型可以工作的问题,你错了
foo(x,(y:Any)=>2)
是完全有效的,这里
A
Any
。这是因为Function1的签名是
trait Function1[-T1,+R]
,这表明T1是逆变的(我想…)@Rex Kerr,不,你明确地写了类型,我的意图是相反的——跳过它。在这种情况下,类型A应该是第一个参数中给出的类型。@Luigi Plinge,你是对的,你能重新发布你的评论作为答案吗?谢谢