2012-05-02 16 views
7

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!

Respuesta

6

Ver Miles Sabin's Shapeless Shapeless. Hay un ejemplo del uso de todas partes en el sybclass test

+0

Exactamente lo que estaba buscando. ¡Gracias! – TOB

+0

¿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? –

+0

@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

Cuestiones relacionadas