No creo que vaya a pasar nada malo. La conversión es completamente inequívoca. En el peor de los casos, Scala no podrá darse cuenta de 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 también serían útiles.
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 éstos:
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. Entonces no son todas las rosas.
Sepa cómo funciona en la práctica. Es posible que necesite equivalentes para Function3, Function4, etc.
No he jugado con esto en 2.8, pero probé esto en los días oscuros de 2.7.X y tendía a provocar bloqueos en el compilador, en el tipo iferenc de referencia. Las cosas han mejorado un poco en ese frente, así que tal vez todo está bien ahora ... –
Sí, todavía es demasiado fácil bloquear el compilador si intentas inferir un tipo de mayor nivel, pero es una gran mejora sobre 2.7. – Apocalisp
Probé estos en 2.8 para casos simples, y todo salió bien. – thSoft