Frage

Wenn ich eine Funktion:

f : A => B => C

I kann eine implizite Konvertierung solche definieren, dass diese verwendet werden können, wo eine Funktion (A, B) => C erwartet wird. Dies geht in der anderen Richtung auch.

Warum sind diese Umwandlungen nicht implizite (oder verfügbar implizit)? Ich gehe davon aus, dass schlechte Dinge für einen Wert von schlechten Dinge passieren könnte. Welcher Wert ist das?

War es hilfreich?

Lösung

Ich glaube nicht, etwas Schlimmes passieren wird. Die Umwandlung ist völlig eindeutig. Im schlimmsten Fall, Scala in der Lage, um herauszufinden, nicht, dass die implizite Konvertierung gilt.

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)

Dann wieder, diese würden auch hilfreich sein.

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)

Aber das ist nicht transitiv, so müssen Sie diese:

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)

Aber jetzt ist die Umwandlung nicht eindeutig. Es ist also nicht alles rosig.

Lassen Sie uns wissen, wie es in der Praxis funktioniert aus. Sie könnten Mittel müssen für Funktion3, Function4, etc.

Andere Tipps

Sie wollen nicht, sie standardmäßig implizit verfügbar (always-on), weil dann das Typsystem Schwierigkeiten hat, hilft Ihnen, wenn Sie mit den Argumenten eines Bündels gleichartiger Typen überlastet:

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?

Ein Teil des Vorteils der starken Typisierung warnen Sie, wenn Sie dumm etwas getan haben. zu hart versuchen, die Dinge Arbeit zu machen reduziert die Vorteile. Wenn hier die Konvertierungen automatisch vorgenommen wurden, könnten Sie nicht rufen Sie die Methode Sie Anruf gemeint.

zu haben, ist sie verfügbar implizit auf Anfrage in Ordnung, aber es ist nicht so schwer, es selbst zu tun, wenn Sie es brauchen. Das ist etwas, dass ich ganz selten verwenden; Ich würde es nicht in meinen Top-Ten platzieren oder wahrscheinlich sogar Top-hundert Dinge, die ich in der Bibliothek möchte (zum Teil, weil ich die automatische Umwandlung in ein Tupel bevorzugen könnte anstelle des automatischen currying / uncurrying).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top