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:
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
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.
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%