Beachten Sie Folgendes:Get Constraint in GADT-Stil-Deklaration, ohne speziell Konstruktor zu verwenden?
{-# LANGUAGE GADTs, GADTSyntax #-}
data Test a where
Test :: Ord a => { first :: a, second :: a } -> Test a
comp :: Test a -> Bool
comp (Test fst snd) = fst < snd
Der Konstruktor Test
ist mit einer Ord
Einschränkung erklärt. In comp
habe ich einen Parameter speziell genommen mit Test
konstruiert, die die Ord
Einschränkung gibt mir erlaubt nun <
zu verwenden, nehme ich schreiben wollte:
comp' :: Test a -> Bool
comp' x = (first x) < (second x)
Unter Verwendung der Projektionsfunktionen erhalten die erstes und zweites Element. Dies ist nicht okay, weil mein Parameter x
nicht (unbedingt) mit Test
konstruiert wurde, so gibt es keine Ord
Einschränkung.
Also, für meine Frage, gibt es eine Möglichkeit, die Parameter zu nehmen, wie gerade x
aber immer noch irgendwie die vom Test
Konstruktor Ord
Einschränkung hat, ohne „auspacken“ zu haben oder Mustererkennung auf das Test
Konstruktor oder die Einschränkung hinzufügen zu meiner Funktion?
Was, warum ich das möchte, habe ich einen Datentyp mit einem Konstruktor viele Werte nehmen, von denen ich nur in dieser besonderen Funktion benötigen, so Auspacken macht es meine Funktion unnötig ausführliche:
myFunction :: Thing -> ...
myFunction (Thing _ _ _ _ need _ _) ...
im Gegensatz zu
myFunction t = ... (need t)
Sie könnten 'myFunction t @ Thing {} = ...' tun. – Alec
'myfunction Thing {need = x}' Dies liefert das 'Ord'-Diktat und Sie haben auch den Wert des 'Need'-Feldes bereits in' x' entpackt. Es gibt auch eine Erweiterung, mit der Sie 'myFunction Thing {need}' schreiben können und im Body können Sie den Namen 'need' verwenden, um auf den Wert des' need' Feldes des Arguments zu verweisen. – Bakuriu
Danke Jungs, wusste nicht über diese Syntax! – cemulate