Es gibt wahrscheinlich keinen Weg, dies zu tun, aber ich wollte nur für den Fall fragen.Ismorphismen für unidirektionales Muster-Synonym manuell eingeben
Ich habe einen Datentyp, der ein einfaches Tupel wie folgt ist:
data Tup a = T a a
ich ein Muster Synonym wie diese:
pattern (:?) ::() => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y)
Die auf T x y
paßt, gibt aber y verwurzelt Platz entfernt. so:
let (_ :? y) = T 1 4 in y
ist
2.0
Ich würde auch verwenden :?
als Konstrukteur gerne in der Lage sein, so würde ich coole Dinge tun können wie:
1 :? 2
Auswertung zu
T 1.0 4.0
natürlich Ich müsste den Isomorphismus manuell angeben, aber gibt es irgendeine Syntax- oder Sprachfunktion, die es mir ermöglichen würde, dieses Verhalten zu erhalten?
Ich kenne die Antwort auf diese spezielle Frage nicht, aber wollte erwähnen, dass Sie dies natürlich mit einem Standarddatentyp tun können wie 'data Thing = Int:? Int'. Dies hilft Ihnen hier jedoch nicht, es sei denn, Sie möchten das Tupel durch einen Datentyp ersetzen. – jamshidh
Ja, in der aktuellen Situation ist das Tupel ein Datentyp mit zwei Feldern, wenn das irgendetwas ändert :) –
Es tut tatsächlich, laut meinem Kommentar. Lass mich dann eine Antwort schreiben. – jamshidh