Übergabe eines formlosen erweiterbaren Datensatzes an eine Funktion (Fortsetzung)

8

In Anbetracht dieser Frage: Übergeben eines formlosen erweiterbaren Datensatzes an eine Funktion , Travis 'Antwort zeigt, dass jede Funktion, die einen erweiterbaren Datensatz als Parameter verwendet, einen impliziten Selektor als Parameter haben muss. Ich frage mich, ob man diese Deklarationen faktorisieren könnte, wenn wir viele Funktionen dieser Art haben. Z.B. :

%Vor%

Danke

Benoit

am 10. Dezember bearbeiten

Wenn Sie den Code der Antwort versuchen, kommt on mit zwei Problemen:

  1. Über den tatsächlichen Typ der Daten, die foo1, foo2, foo3 zugeordnet sind, wird nichts gesagt: Folglich kann eine Funktion wie fun1 keine mit diesen Typen verbundene Methode verwenden. Wenn z. B. foo3 ein Double ist, kann es seine Quadratwurzel nicht annehmen.
  2. Wenn ich fun1 mit ("foo1" - & gt; & gt; "hello") :: ("foo2" - & gt; 1): :( "foo3" - & gt; & gt; 1.2) :: HNiL, the Ergebnis ist (hallo, 1, 1.2) mit type (selectors.s1.Out, selectors.s2.Out, selectors.s3.Out) Wenn ich versuche, 1 zum letzten Wert (1.2) hinzuzufügen, beschwert sich Scala, dass es keinen Int und einen selectors.s3.Out hinzufügen kann, aber wenn ich schreibe:

    %Vor%

    Ich kann schreiben:

    %Vor%

    und scala antwortet True!

Ich habe versucht, den Code auf diese Weise zu modifizieren, indem ich hoppe, dass die Typen propagiert werden, aber das Problem wird dadurch nicht gelöst. Ich kann fun1 nicht einmal mit (foo1- & gt; & gt; "Hallo") :: (foo2 - & gt; 1): :( foo3 - & gt; & gt; 1.2) :: HNil als Parameter aufrufen:

%Vor%

Gibt es einen Weg zum Fortschritt?

Benoit

    
bhericher 01.12.2013, 11:25
quelle

2 Antworten

14

Sie können Ihre eigene Typklasse definieren, um den Nachweis zu erhalten, dass der Datensatz die benötigten Felder enthält:

%Vor%

Und dann zum Beispiel:

%Vor%

Es ist immer noch ein wenig wortreich, besonders da der Import notwendig ist, aber viel weniger, als alle Selektoren einzeln als implizite Parameter zu erfordern.

    
Travis Brown 01.12.2013, 17:25
quelle
4

Der Out-Typ eines bestimmten Feldes kann mit folgendem Befehl angegeben werden:

%Vor%

Außerdem können wir die Syntax mit einem Typkonstruktor etwas vereinfachen:

%Vor%     
Mikael Valot 11.05.2014 11:47
quelle

Tags und Links