Wie definiert man eine Funktion, die in Scala mit nicht verwandten Typen zusammenarbeitet?

8

Ich möchte eine Funktion definieren, die * 2 auf ihr Argument anwendet, das für alle Typen funktioniert, bei denen es sinnvoll ist. Ich habe versucht, Strukturtypen zu verwenden:

%Vor%

Es funktioniert für Strings:

%Vor%

Aber nicht für Zahlen:

%Vor%
  1. Warum bekomme ich diese Fehlermeldung?
  2. Kann ich mit Strukturtypen machen, was ich will?
  3. Ist es möglich, es auf eine andere Weise zu tun?

Bearbeiten : Mit "tun, was ich will" meine ich, dass ich für bereits existierende Typen wie Zahlen und Strings arbeite, nicht nur für Klassen, die ich selbst definiere.

    
michau 09.09.2016, 14:19
quelle

3 Antworten

3
  1. * wird in $times übersetzt, der Strukturtyp prüft das Vorhandensein von * method, aber (ich nehme an, das ist ein Fehler) ruft es interne ( $times ) Darstellungen auf. Das funktioniert für String , weil für sie $times ist.

  2. Dieser Ansatz sollte für Methoden mit Namen funktionieren, die nur Buchstaben enthalten.

'' '

%Vor%
  1. Ja, idiomatische Antwort ist typeclasses . Sie wählen, was genau "Sinnhaftigkeit" ist. Und sie können auf jede bereits existierende Klasse angewendet werden:

'' '

%Vor%

Beachten Sie auch, dass die strukturelle Typisierung reflection = & gt; ist ziemlich langsam.

    
dveim 09.09.2016 15:23
quelle
3

Sie könnten die Methode immer nur überladen. Damit es in der REPL funktioniert, musst du% co_de als Block deklarieren.

%Vor%     
jwvh 09.09.2016 16:01
quelle
0

Eine weitere Möglichkeit, die ich gefunden habe, ist die Verwendung von Makros. Ab Scala 2.11.8 sind sie noch experimentell und, so Martin Odersky, werden in dieser Form nicht überleben . Das aktuelle Synax ist ungeschickt, aber bis jetzt ist es die einzige Methode, die vollständig DRY ist ( * 2 wird nur einmal geschrieben, und die Funktion funktioniert bei allen Typen, die diese Operation unterstützen).

Unabhängig davon, ob dies die beste Lösung ist, poste ich es aus Gründen der Vollständigkeit:

%Vor%     
michau 14.09.2016 11:18
quelle

Tags und Links