Je ne pense pas que quelque chose de mauvais va arriver. La conversion est complètement non ambiguë. Dans le pire des cas, Scala ne pourra pas comprendre que la conversion implicite s'applique.
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)
Ensuite, ceux-ci seraient également utiles.
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)
Mais ce ne sont pas transitif, vous devez donc celles-ci:
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)
Mais maintenant, la conversion est ambiguë. Donc, ce ne sont pas toutes des roses.
Apprenons comment cela fonctionne dans la pratique. Vous pourriez avoir besoin d'équivalents pour Function3, Function4, etc.
Je n'ai pas joué avec cela dans 2.8, mais j'ai essayé cela dans les jours sombres de 2.7.X et il a tendance à conduire à des plantages du compilateur, dans le type inferencer iirc. Les choses se sont un peu améliorées sur ce front, alors peut-être que tout va bien maintenant ... –
Ouais, il est toujours trop facile de planter le compilateur si vous essayez de le faire inférer d'un type plus élevé, mais c'est une énorme amélioration par rapport à 2.7. – Apocalisp
J'ai essayé ceux-ci en 2,8 pour les cas simples, et tout s'est bien passé. – thSoft