Если у меня есть функция:
f : A => B => C
Я могу определить неявное преобразование, таким образом, что это может использоваться где функция (A, B) => C
ожидается. Это входит в другое направление также.
Почему эти преобразования не неявны (или доступны неявно)? Я предполагаю, что плохие вещи могли произойти для некоторого значения плохих вещей. Какое значение - это?
Не думаю, что случится что-то плохое. Конверсия совершенно однозначная. В худшем случае 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 и т. Д.
Вы не хотите, чтобы они были неявно доступны по умолчанию (всегда включены), потому что тогда у системы типов возникнут проблемы поможет вам, когда вы перегружены аргументами множества схожих типов:
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?
Отчасти преимущество строгой типизации состоит в том, чтобы предупреждать вас, когда вы сделали что-то глупое. Слишком усердные попытки заставить вещи работать уменьшают выгоду. Здесь, если преобразования выполнялись автоматически, вы могли не вызывать метод, который собирались вызвать.
Неявно иметь их доступными по запросу - это нормально, но это не так сложно сделать самостоятельно, если вам это нужно. Это то, что я бы использовал довольно редко; Я бы не стал помещать его в десятку или, возможно, даже сотню лучших вещей, которые мне хотелось бы добавить в библиотеку (отчасти потому, что я мог бы предпочесть автоматическое преобразование в кортеж вместо автоматического каррирования / удаления).