Скажем, у меня есть метод, который превращает (функцию двух элементов) в (функцию двух последовательностей):
def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
Другими словами, результирующая функция берет две последовательности xs
и ys
и создает новую последовательность, состоящую из (xs(0) f ys(0), xs(1) f ys(1), ...)
. Так, например, если xss
равно Seq(Seq(1,2),Seq(3,4))
, а f
равно (a: Int, b: Int) => a + b
, мы можем вызвать ее следующим образом:
xss reduceLeft seqed(f) // Seq(4, 6)
или с анонимной функцией:
xss reduceLeft seqed[Int](_+_)
Это очень хорошо; было бы неплохо избавиться от аргумента типа [Int]
, но я не понимаю, как это сделать (есть идеи?).
Чтобы он немного больше походил на метод tupled
, я также попробовал шаблон обогащения моей библиотеки:
class SeqFunction[T](f: (T,T) => T) {
def seqed: (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
}
implicit def seqFunction[T](f: (T,T) => T) = new SeqFunction(f)
Для предопределенной функции это прекрасно работает, но с анонимными это некрасиво.
xss reduceLeft f.seqed
xss reduceLeft ((_:Int) + (_:Int)).seqed
Есть ли другой способ переформулировать это так, чтобы типы выводились, и я могу использовать синтаксис примерно так:
// pseudocode
xss reduceLeft (_+_).seqed // ... or failing that
xss reduceLeft (_+_).seqed[Int]
? Или я слишком много требую от вывода типов?
scala
и других языках со статической типизацией. Может быть, это не совсем по теме, но в любом случае, мне было очень интересно. - person 4e6   schedule 01.12.2011