Вывод типа для анонимных функций с помощью enrich-my-library

Скажем, у меня есть метод который превращает (функцию для двух элементов) в (функцию для двух последовательностей):

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), ...) Так, например, if 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 , я также попробовал шаблон enrich-my-library:

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)

Для предопределенной функции это отлично работает, но некрасиво с анонимным ones

xss reduceLeft f.seqed
xss reduceLeft ((_:Int) + (_:Int)).seqed

Есть ли другой способ переформулировать это так, чтобы типы выводились, и я мог бы использовать синтаксис вроде:

// pseudocode
xss reduceLeft (_+_).seqed         // ... or failing that
xss reduceLeft (_+_).seqed[Int]

? Или я слишком много прошу о выводе типа?

5
задан 0__ 8 June 2013 в 12:02
поделиться