Почему карри и нетуринг не скрыты в скале? - PullRequest
13 голосов
/ 11 августа 2010

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

f : A => B => C

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

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

Ответы [ 2 ]

12 голосов
/ 11 августа 2010

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

8 голосов
/ 11 августа 2010

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

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?

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

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

...