Почему приправляет карри и не приправляет карри не неявный в scala

Если у меня есть функция:

f : A => B => C

Я могу определить неявное преобразование, таким образом, что это может использоваться где функция (A, B) => C ожидается. Это входит в другое направление также.

Почему эти преобразования не неявны (или доступны неявно)? Я предполагаю, что плохие вещи могли произойти для некоторого значения плохих вещей. Какое значение - это?

13
задан oxbow_lakes 11 August 2010 в 11:54
поделиться

2 ответа

Не думаю, что случится что-то плохое. Конверсия совершенно однозначная. В худшем случае 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 и т. Д.

12
ответ дан 1 December 2019 в 22:54
поделиться

Вы не хотите, чтобы они были неявно доступны по умолчанию (всегда включены), потому что тогда у системы типов возникнут проблемы поможет вам, когда вы перегружены аргументами множества схожих типов:

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?

Отчасти преимущество строгой типизации состоит в том, чтобы предупреждать вас, когда вы сделали что-то глупое. Слишком усердные попытки заставить вещи работать уменьшают выгоду. Здесь, если преобразования выполнялись автоматически, вы могли не вызывать метод, который собирались вызвать.

Неявно иметь их доступными по запросу - это нормально, но это не так сложно сделать самостоятельно, если вам это нужно. Это то, что я бы использовал довольно редко; Я бы не стал помещать его в десятку или, возможно, даже сотню лучших вещей, которые мне хотелось бы добавить в библиотеку (отчасти потому, что я мог бы предпочесть автоматическое преобразование в кортеж вместо автоматического каррирования / удаления).

8
ответ дан 1 December 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: