Non credo che accada qualcosa di brutto. La conversione è completamente non ambigua. Nel caso peggiore, Scala non sarà in grado di capire che si applica la conversione implicita.
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)
Quindi, anche in questo caso sarebbe utile.
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)
Ma quelli non sono transitiva, quindi è necessario questi:
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)
Ma ora la conversione è ambiguo. Quindi non sono tutte rose.
Sappiamo come funziona in pratica. Potresti aver bisogno di equivalenti per Function3, Function4, ecc.
Non ho giocato con questo in 2.8, ma l'ho provato nei giorni bui di 2.7.X e tendeva a causare arresti anomali del compilatore, nel tipo inferirore iirc. Le cose sono migliorate un po 'su quel fronte, quindi forse è tutto buono ora ... –
Sì, è ancora troppo facile mandare in crash il compilatore se cerchi di inferire un tipo più alto, ma è un enorme miglioramento rispetto a 2.7. – Apocalisp
Ho provato questi in 2.8 per casi semplici, e tutto è andato bene. – thSoft