Pregunta

Si tengo una función:

f : A => B => C

I puede definir una conversión implícita de tal manera que esto se puede utilizar donde se espera una (A, B) => C función. Esto va en la otra dirección también.

¿Por qué son estas conversiones no implícita (o disponibles de forma implícita)? Estoy asumiendo que lo malo podría suceder para algún valor de las cosas malas. ¿Qué valor es esto?

¿Fue útil?

Solución

No creo que nada malo va a pasar. La conversión es completamente inequívoca. Peor de los casos, Scala no será capaz de averiguar que se aplica la conversión implícita.

implicit def curryImplicitly[A,B,C](f: (A, B) => C) =
  (a: A) => (b: B) => f(a, b)
implicit def uncurryImplicitly[A,B,C](f: A => B => C) =
  (a: A, b: B) => f(a)(b)

Por otra parte, estos serían también de utilidad.

implicit def flipImplicitly[A,B,C](f: (A, B) => C) =
  (b: B, a: A) => f(a, b)
implicit def flipImplicitlyCurried[A,B,C](f: A => B => C) =
  (b: B) => (a: A) => f(a)(b)

Pero esas no son transitivos, por lo que necesita los siguientes:

implicit def flipAndCurry[A,B,C](f: (A, B) => C) =
  (b: B) => (a: A) => f(a, b)
implicit def flipAndUncurry[A,B,C](f: A => B => C) =
  (b: B, a: A) => f(a)(b)

Pero ahora la conversión es ambigua. Así que no es todas las rosas.

Vamos a saber cómo funciona en la práctica. Es posible que tenga equivalentes para FUNCTION3, FUNCTION4, etc.

Otros consejos

Usted no quiere que implícitamente disponibles por defecto (siempre activo) porque entonces el sistema de tipos tiene problemas para ayudar a salir cuando se ha sobrecargado con argumentos de un montón de tipos similares:

A => B => C
D => C      // D is allowed to be a tuple (A,B)...

(A,B) => C  // If I have this, to whom should I convert?

Parte de la ventaja de una gran escritura le advierte cuando se ha hecho algo tonto. Tratando demasiado duro para hacer las cosas de trabajo reduce los beneficios. Aquí, si las conversiones se realizan de forma automática, es posible que no llame al método que quería decir a la llamada.

Tener a disposición de forma implícita a petición está muy bien, pero no es tan difícil de hacer usted mismo si lo necesita. Esto es algo que yo usaría bastante rara; No voy a poner en mi top ten o probablemente incluso superiores cientos de cosas que me gustaría en la biblioteca (en parte porque puede ser que prefiera la conversión automática a una tupla en lugar de la currificación automática / uncurrying).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top