Почему карри и бесшумный не подразумевают в Scala
-
27-09-2019 - |
Вопрос
Если у меня есть функция:
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?
Часть преимущества сильного печатания предупреждает вас, когда вы сделали что-то глупо. Слишком сложно сделать, чтобы все работало снижает преимущества. Здесь, если преобразования были сделаны автоматически, вы можете не вызывать метод, который вы хотите позвонить.
Имея их доступен неявно по запросу, в порядке, но это не так уж сложно сделать сами, если вам это нужно. Это то, что я бы использовал довольно редко; Я бы не поставил его в топ-десять или, вероятно, даже сотням вещей, которые я хотел бы в библиотеке (частично, потому что я могу предпочесть автоматическое преобразование в кортеж вместо автоматического карри / безразличного).