functores scala functor scalaz scalaz7 bijection

scala - functores - functor prolog



Levantando una bijección en un funtor. (1)

Tal vez me esté perdiendo algo obvio, pero estoy tratando de limpiar algo en un proyecto que usa Scalaz 7, y no encuentro una pieza de rompecabezas en particular que parezca bastante simple y posiblemente útil.

Supongamos que tenemos una bijección entre dos tipos:

case class Foo(x: Int) case class Bar(i: Int) import scalaz._, Scalaz._, BijectionT._ val fb: Foo <@> Bar = bijection[Id, Id, Foo, Bar]( foo => Bar(foo.x), bar => Foo(bar.i) )

Supongamos ahora que necesitamos una bijección entre List[Foo] y List[Bar] . Podemos escribir fácilmente una clase implícita que proporciona esta funcionalidad (de hecho, también podemos hacer que funcione para cualquier functor):

implicit class BijectionLifter[A, B](val bij: A <@> B) extends AnyVal { def liftInto[F[_]: Functor]: F[A] <@> F[B] = bijection[Id, Id, F[A], F[B]]( _ map bij.to, _ map bij.from ) }

Tenga en cuenta que esta es una traducción directa de bimap de bimap de Haskell. La bijección de Scalaz también tiene un método llamado bimap , pero tiene un tipo mucho más concurrido y no parece hacer lo que quiero de ninguna manera obvia.

Ahora solo podemos escribir lo siguiente:

fb.liftInto[List]

Y tenemos la bijección que necesitamos.

¿Me estoy perdiendo algo de abstracción que me permitiría escribir esto de manera más limpia con las funciones e instancias ya proporcionadas para bijections en Scalaz 7?


Para citar a Lars Hupel de Twitter en respuesta a esta pregunta :

No tengo idea de qué es nuestro bimap o qué se supone que debe hacer.

Y:

Relacionado: La parte T de BijectionT es probablemente incorrecta. Probablemente deba ser reescrito para que se parezca a la versión de Haskell.

Así que la respuesta es aparentemente no, no me faltaba nada, en realidad es un vacío en la API actual que probablemente se solucionará en una futura versión de Scalaz.