Komponententyp Konstruktoren wie Funktionen

8

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).

    
Alec 24.06.2015, 05:47
quelle

1 Antwort

10
  

(Ich weiß, dass Control.Compose existiert, aber es erstellt einfach ein    newtype 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 .

schreiben

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):

%Vor%

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.

    
chi 24.06.2015, 08:09
quelle

Tags und Links