2016-04-26 4 views
3

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?

+0

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

+0

Ja, in der aktuellen Situation ist das Tupel ein Datentyp mit zwei Feldern, wenn das irgendetwas ändert :) –

+0

Es tut tatsächlich, laut meinem Kommentar. Lass mich dann eine Antwort schreiben. – jamshidh

Antwort

8

Ab GHC 7.10 können Sie

pattern (:?) ::() => Floating a => a -> a -> Tup a 
pattern (x :? y) <- T x (sqrt->y) where 
    x :? y = T x (y^2) 

Meine größte Sorge verwenden ist, dass sqrt und ^2 sind nicht ganz Umkehrungen, da sowohl negative Zahlen haben keine wirkliche Quadratwurzeln und weil Gleitpunktarithmetik ungenau .

+0

oh, das ist schön! Ich frage mich, ob ich wirklich schlecht in der Dokumentation bin? –

+0

wie für den unvollständigen Isomorphismus, ist eine der intern gepflegten Einschränkungen des Typs 'Tup', dass sie niemals negative Zahlen speichert, so dass diese Invarianz intern von der Bibliothek aufrechterhalten wird. Der Benutzer darf niemals direkt Werttypen mit dem 'T'-Konstruktor erstellen, so dass der Export nur' +/-' gut funktioniert. Vielen Dank! –

Verwandte Themen