Идиоматический способ создания безымянного извлекающего функционала - PullRequest
2 голосов
/ 02 марта 2012

Учитывая, что есть функция 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), что уродливо, но работает нормально .. Однако,Я ожидал бы, что смогу вызвать foo с чем-то вроде foo(case (_, b, _) => b), однако это не сработает.

Так, каков простой идиоматический способ создания простой неназванной функции извлечения?*

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Вам не нужно ключевое слово 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
2 голосов
/ 02 марта 2012

Таким образом, если типы могут быть выведены, вы можете просто сделать следующее:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...