Ich kann nur Rang-n-Typen in Idris 0.9.12 in einer ziemlich unbeholfen Weise tun:Doing Rang-n Quantifizierung in Idris
tupleId : ((a : Type) -> a -> a) -> (a, b) -> (a, b)
tupleId f (a, b) = (f _ a, f _ b)
ich die Unterstrichen müssen überall dort, wo eine Art Anwendung ist, weil Idris analysieren wirft Fehler, wenn ich versuche, die (verschachtelten) Typen Argumente implizit zu machen:
tupleId : ({a : Type} -> a -> a) -> (a, b) -> (a, b) -- doesn't compile
A wahrscheinlich größeres Problem ist, dass ich nicht Klasse Einschränkungen in höherrangigen Typen überhaupt tun kann. Ich kann die folgende Haskell Funktion Idris übersetzen:
appShow :: Show a => (forall a. Show a => a -> String) -> a -> String
appShow show x = show x
Das bin ich auch mit Idris Funktionen als Typ Synonyme verhindert für Typen wie Lens
, die Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
in Haskell ist.
Jede Möglichkeit, die oben genannten Probleme zu beheben oder zu umgehen?
Es ist auf meiner TODO-Liste - normalerweise Dinge auf der TODO-Liste nach oben, wenn jemand anderes nach ihnen fragt, also nur diese Frage ist eine Möglichkeit, um es zu beheben :). Überraschenderweise ist das nicht wirklich gefragt, obwohl es natürlich nett wäre. Es gibt einige Tricks, um implizite Argumente richtig zu machen, deshalb haben wir jetzt einen ziemlich einfachen Ansatz gewählt. Typklassen sind die erste Klasse, daher gibt es auch eine unbeholfene Art, Klasseneinschränkungen durchzuführen - behandle sie als normale Funktionsargumente und verwende '% instance', um die Instanz explizit zu finden. –
@EdwinBrady danke, ich akzeptiere dies als Antwort (oder würde ich tun, wäre es eine Antwort). –
Es fühlt sich noch nicht wie eine richtige Antwort an ... Ich werde hoffentlich bald wieder zu dir kommen! –