Я не думаю, что что-то плохое произойдет. Преобразование абсолютно недвусмысленно. В худшем случае Scala не сможет понять, что применяется неявное преобразование.
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)
С другой стороны, это также было бы полезно.
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)
Но это не транзитивно, так что вам нужны эти:
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)
Но теперь преобразование неоднозначно. Так что это не все розы.
Давайте знать, как это работает на практике. Вам могут потребоваться эквиваленты для Function3, Function4 и т. Д.
Я не играл с этим в 2.8, но я попробовал это обратно в темные дни 2.7.X, и это, как правило, приводило к сбоям компилятора в типе inferencer iirc. Вещи улучшили справедливый бит на этом фронте, так что, может быть, теперь все хорошо ... –
Да, все равно слишком сложно скомпрометировать компилятор, если вы попытаетесь сделать его более высокодоходным, но это значительно улучшилось 2,7. – Apocalisp
Я попробовал их в 2.8 для простых случаев, и все прошло хорошо. – thSoft