Скажем, у меня есть метод который превращает (функцию для двух элементов) в (функцию для двух последовательностей):
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]
? Или я слишком много прошу о выводе типа?