创建未命名的提取函数的惯用scala方法

时间:2012-03-01 23:23:01

标签: scala idiomatic

鉴于有一个函数foo[A, B, C]( func: (a: A, b: B, c: C) => B),我想传入这个函数def secondOfThree[A, B, C](a: A, b: B, c: C): B = b

我可以使用foo来调用foo(secondOfThree)这很难看,但工作正常。但是,我希望能够使用{{1}的内容来调用foo但是这不起作用。

那么创建简单的未命名提取函数的干净惯用scala方法是什么?

2 个答案:

答案 0 :(得分:4)

您不需要case关键字,但Scala 需要知道类型:

scala> def foo[A, B, C](func: (A, B, C) => B) = ...
foo: [A, B, C](func: (A, B, C) => B)Nothing

scala> foo[Symbol, Int, Char]((_, b, _) => b)

如果foo知道类型,则调用不需要指定它们:

scala> def foo(func: (Symbol, Int, Char) => Int) = func('a, 2, 'c') + 5
foo: (func: (Symbol, Int, Char) => Int)Int

scala> foo((_, b, _) => b)
res3: Int = 7

答案 1 :(得分:2)

因此,如果可以推断出类型,那么你可以做到最简单:

class Trio[A, B, C](a: A, b: B, c: C) {
  def foo(func: (A, B, C) => B): B = func(a, b, c)
}

println(new Trio(1, "string", 'Symbol).foo((_, b, _) => b))