Ich bin kürzlich auf eine Situation gestoßen, in der ich Typkonstruktoren in einer Instanzdeklaration schreiben wollte. Ich hätte das gerne gemacht:
%Vor% mit (t . t')
so definiert, dass (t . t') a = t (t' a)
(also t
und t'
art * -> *
haben. Wir können Typkonstruktoren wie Funktionen teilweise anwenden, weshalb können wir sie nicht erstellen? Auch Gibt es vielleicht einen Workaround für das, was ich erreichen wollte? Vielleicht mit Gleichheitsbeschränkungen?
(Ich weiß, dass Control.Compose existiert, aber es erstellt einfach einen newtype
-Wrapper - ich möchte ein Typ-Synonym).
(Ich weiß, dass
Control.Compose
existiert, aber es erstellt einfach einnewtype
wrapper - Ich möchte ein Typ-Synonym).
Dies ist in Haskell nicht erlaubt. Ein Typ-Synonym muss vollständig angewendet werden: Sie können nicht Compose t t'
, nur Compose t t' a
.
Das Zulassen von teilweise angewandten Typ-Synonymen würde zu labdas auf Typenebene führen, was Typinferenz entzifferbar macht, daher die fehlende Unterstützung in Haskell.
Zum Beispiel (Aktivierung aller relevanten GHC-Erweiterungen)
%Vor%ergibt:
%Vor%Ähnlich,
%Vor%ergibt:
%Vor% Hier ist ein Beispiel, in dem der Typ synonym partielle Anwendung erlaubt ist (stattdessen LiberalTypeSynonyms
aktivieren):
Beachten Sie jedoch, dass dies nur funktioniert, weil wir nach der Synonym-Erweiterung einen vollständig angewendeten Typ [] ([] Int)
(d. h. [[Int]]
) erhalten. Grob gesagt erlaubt diese Funktion nichts, was man ohne sie hätte tun können, indem sie die Synonyme manuell erweitert.
Tags und Links haskell