Question

Si j'ai une fonction:

f : A => B => C

Je peux définir une conversion implicite telle que cela peut être utilisé lorsqu'une (A, B) => C fonction est attendue. Cela va dans l'autre sens aussi.

Pourquoi ces conversions pas implicite (ou implicitement disponibles)? Je suppose que mauvaises choses pourrait se produire pour une valeur de mauvaises choses. Quelle valeur est-ce?

Était-ce utile?

La solution

Je ne pense pas que quelque chose de mauvais va se passer. La conversion est tout à fait sans ambiguïté. Le pire des cas, Scala ne sera pas en mesure de comprendre que la conversion implicite applique.

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)

Là encore, ceux-ci seraient également utiles.

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)

Mais ce ne sont pas transitif, vous devez donc ceux-ci:

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)

Mais maintenant, la conversion est ambiguë. Il est donc pas toutes les roses.

Le savoir Let comment cela fonctionne dans la pratique. Vous pourriez avoir besoin d'équivalents pour FUNCTION3, Function4, etc.

Autres conseils

Vous ne par défaut (toujours sur) implicitement voulez pas disponible parce que le système de type a du mal à vous aider quand vous avez surchargé avec des arguments d'un groupe de types similaires:

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?

Une partie de l'avantage de typage fort vous avertit lorsque vous avez fait quelque chose de stupide. Trop d'efforts pour faire fonctionner les choses réduit les avantages. Ici, si les conversions ont été faites automatiquement, vous ne pouvez pas appeler la méthode que vous vouliez dire à l'appel.

Après les avoir disponibles implicitement sur demande est bien, mais ce n'est pas difficile de le faire vous-même si vous en avez besoin. C'est quelque chose que j'utiliser assez rarement; Je ne mettrais pas dans mon top dix ou probablement même top cent choses que je voudrais dans la bibliothèque (en partie parce que je pourrais préférer la conversion automatique à un tuple au lieu du curryfication automatique / uncurrying).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top