Decir que tengo un método que convierte una (función de dos elementos) en un (función en dos secuencias):La inferencia de tipos de funciones anónimas con Enrich-mi-librería
def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
En palabras, la función resultante toma dos secuencias xs
y ys
, y crea una nueva secuencia que consiste en (xs(0) f ys(0), xs(1) f ys(1), ...)
Así, por ejemplo, si es xss
Seq(Seq(1,2),Seq(3,4))
y f
es (a: Int, b: Int) => a + b
, podemos invocar así:
xss reduceLeft seqed(f) // Seq(4, 6)
o con una función anónima:
xss reduceLeft seqed[Int](_+_)
Esto es bastante bueno; Sería bueno deshacerse del argumento de tipo [Int]
, pero no veo cómo (¿alguna idea?).
Para hacer que se sienta un poco más como el método tupled
, también probé el patrón Enrich-mi-biblioteca:
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)
Para una función predefinida esto funciona muy bien, pero es feo, con los anónimos
xss reduceLeft f.seqed
xss reduceLeft ((_:Int) + (_:Int)).seqed
¿hay otra manera de que pueda reformular esto para que los tipos se infieren, y puedo usar la sintaxis algo como:
// pseudocode
xss reduceLeft (_+_).seqed // ... or failing that
xss reduceLeft (_+_).seqed[Int]
? ¿O estoy pidiendo demasiado de tipo de inferencia?
[Aquí] (http://screencasts.chariotsolutions.com/uncovering-the-unknown-principles-of-type-inference-) Daniel Spiewak hizo una presentación sobre los sistemas de tipo y la inferencia de tipo en 'scala' y otros estáticos mecanografiados. Tal vez eso no sea exactamente sobre el tema, pero de todos modos, lo encontré extremadamente interesante. – 4e6