Unten ist ein vielleicht dummes Beispiel, aber ich denke, das Lösen wird ein anderes Problem, das ich habe, detailliert in this question.Optimierung basierend auf Funktion Ergebnis Typ
Ich mag eine Funktion mit dieser Signatur schreiben:
myread :: (Read a) => String -> a
so dass myread = read
, außer wenn a ~ Int
, wobei in diesem Fall myread _ = 0
.
Offensichtlich ist diese Funktion albern selbst, aber der Punkt ist, ich möchte basierend auf Rückgabetyp optimieren.
Regeln neu schreiben, oder alles ist in Ordnung hier. Für mein tatsächliches Problem, wenn die Lösung eine Rewrite-Regel ist, spielt es keine Rolle, ob es Fälle gibt, in denen es nicht zündet, aber ich möchte die Antwort, um wenigstens ein Beispiel zu geben, wo es ist.
Es scheint, als ob Sie bereits das richtige Werkzeug zur Hand haben - die Klassenbeschränkung für 'a'. Sie kontrollieren natürlich nicht die 'Read Int' -Instanz, aber es scheint, dass Sie in Ihrem tatsächlichen Anwendungsfall die Definition und die Instanzen der Klasse steuern. Oder vielleicht habe ich missverstanden, was Sie mit "optimieren" meinen? (beiseite: Ich denke, die Lösung in der anderen Antwort funktioniert nicht, weil 'x :: H a => T a 'nicht" x vom Typ T a im Kontext H a "sondern" x vom Typ' H "bedeutet a => T a ", dh die Regel würde angewendet auf' (Lesen a => F a) -> X 'nicht' Lesen a => F a -> X ') – user2407038
Ich kontrolliere nicht das 'Read' Klasse, und ich kann nicht meine 'Read' -Instanz für' Int' erstellen, wenn eine bereits existiert. Vielleicht verstehe ich dich falsch. – Clinton