Haskell tiene estas geniales cosas cruzadas genéricas que le permiten llamar algo así como map
en cada nodo de una colección, ya sea de abajo hacia arriba o de arriba hacia abajo. Se llama everywhere
y harías algo como everywhere f tree
y se llamaría a f
en cada nodo de tu árbol.¿Deseche su equivalente en Scala?
Escribir algo equivalente en Scala para Traversable
es fácil, pero Haskell también funciona con tuplas y el equivalente de clases de casos o, más genéricamente, lo que Scala llama Product
s.
se puede recorrer a través de los elementos de una Product
utilizando el método productIterator
, pero ¿hay alguna manera fácil de poner una tupla o una clase caso de nuevo juntos una vez que sabes lo que los argumentos al constructor (en realidad, supongo que la apply
método) debería ser?
def mapOnProduct[X](f: X -> X, prod: Product) {
val newArgs = prod.productIterator.map {
case x: X => f(x)
case id => id
}.toList
[?].apply(newArgs: _*)
}
Qué puedo reemplazar con [?]
modo que esto tiene alguna posibilidad de trabajar?
Gracias!
Exactamente lo que estaba buscando. ¡Gracias! – TOB
¿Puede esto tomar una clase de caso arbitrario y devolver una nueva instancia basada en una función de sus parámetros, y funcionar con todas las instancias de Producto, o solo está limitado a tuplas? –
@LuigiPlinge: esto también funciona con clases de casos, al menos desde el informe 2.0, gracias a las macros. Un buen ejemplo es [aquí] (https://github.com/milessabin/shapeless/blob/e3399e35a7bb17b286141f53827619a3dc98efe8/examples/src/main/scala/shapeless/examples/sybclass.scala#L65). – Blaisorblade