Ad-hoc-Kettchen in Haskell

8

In Haskell ist es einfach, Funktionen zu schreiben, die auf Tupel von Dingen einwirken oder diese zurückgeben, z. die Auftaktfunktion splitAt:

%Vor%

Aber gibt es keine einfache, bequeme Art, Funktionen zu schreiben, die auf -Cotuples von Dingen wirken? Z.B. eine Funktion, die ein Int oder ein Double zurückgibt. Nehmen wir als konkretes Beispiel an, dass ich eine Funktion schreiben möchte

%Vor%

wo + ist mein Symbol für cotupling, also gibt MyDivision x y x / y als Int zurück, wenn die Division zu einer Ganzzahl führt, aber zu einem Double, wenn die Division keine Ganzzahl ergibt.

Bisher scheint es, dass ich zwei Möglichkeiten habe, entweder einen neuen Datentyp zu deklarieren

%Vor%

oder verwenden

%Vor%

wo die erste Alternative viel Tipparbeit und das Nachdenken über Namen erfordert und die zweite Alternative schnell unordentlich wird, wenn Sie größere Figuren haben und Typen bekommen, die wie

aussehen %Vor%

Nun, wenn ich einen Typ hatte, sag

%Vor%

Ich möchte in der Lage sein, Funktionen zu bilden

%Vor%

nur durch die Bereitstellung von Funktionen

%Vor%

und Einstellung

%Vor%

oder etwas Ähnliches.

Ist das möglich?

    
Calle 24.06.2014, 20:20
quelle

2 Antworten

6

Ich habe Ihre + in >+< und Ihre <+> in >*< umbenannt, aber Sie könnten so etwas tun:

%Vor%

Ich habe versucht, die Operatoren so zu benennen, dass sie mehr auf ihre Funktionsweise hindeuten.

Hier ist eine andere Möglichkeit, >*< zu implementieren:

%Vor%

Als eine Randnotiz: "Tupel" werden oft als Produkttypen bezeichnet, und das nennt man einen Koproduktyp (oder Sum-Typ). Der grundlegendste Koproduktyp ist Either und alle anderen Koproduktypen sind isomorph zu Either A B für einige Typen A und B .

    
David Young 24.06.2014, 20:46
quelle
13

Nun Co-Tupel werden richtig Coprodukte genannt, die nur Either sind.

Also, lass uns weitermachen und etwas wie

tun %Vor%

Dies ist übrigens assoziativ. Jetzt haben wir eine schöne Syntax wie

%Vor%

Nun, das, was Sie dort zu haben scheinen, ist in der Tat sehr ähnlich zu einer Kirchenvertretung von Either abgeflacht. Wir können das einfach mit dem either Kombinator

aufbauen %Vor%

Eine lustige Herausforderung wäre es, eine generische inject -Funktion zu erstellen, die etwas wie Proxy k enthält, wobei k eine Repräsentation natürlicher Zahlen auf der Typ-Ebene ist und eine große verschachtelte Menge von Either s für dich zurückgibt .

Aktualisierung:

Mir wurde langweilig, hier ist der Code für generische inj

%Vor%     
jozefg 24.06.2014 20:34
quelle

Tags und Links