Вопрос

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

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)

Но теперь преобразование неоднозначно. Так что это не все розы.

Давайте узнаем, как это работает на практике. Вам может потребоваться эквиваленты для функции3, функции4 и т. Д.

Другие советы

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

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?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top