2014-11-23 15 views
10

Man kann einen Typen in einer Funktion in Idris zurückkehren, zum BeispielGibt es eine nette Möglichkeit, `->` direkt als Funktion in Idris zu verwenden?

t : Type -> Type -> Type 
t a b = a -> b 

Aber die Situation kam (wenn mit dem Schreiben einiger Parser experimentieren), dass ich

-> zu falten, um eine Liste von Typen, also nutzen wollte
typeFold : List Type -> Type 
typeFold = foldr1 (->) 

So dass typeFold [String, Int]String -> Int : Type geben würde. Dies lässt sich nicht kompilieren aber:

error: no implicit arguments allowed 
    here, expected: ")", 
    dependent type signature, 
    expression, name 
typeFold = foldr1 (->) 
       ^

Aber das funktioniert gut:

t : Type -> Type -> Type 
t a b = a -> b 

typeFold : List Type -> Type 
typeFold = foldr1 t 

Gibt es eine bessere Art und Weise mit -> zu arbeiten, und wenn nicht, ist es wert, als Feature-Request erhöhen?

Antwort

10

Das Problem bei der Verwendung -> auf diese Weise ist, dass es kein Typkonstruktor ist, sondern ein Bindemittel, wo der Name für die Domäne im Bereich im Bereich gebunden ist, so -> selbst hat keinen Typ direkt. Ihre Definition von t würde beispielsweise keinen abhängigen Typ wie (x : Nat) -> P x erfassen.

Während es ein wenig fummelig ist, was Sie tun, ist der richtige Weg, dies zu tun. Ich bin nicht überzeugt, dass wir eine spezielle Syntax für (->) als Typkonstruktor machen sollten - teilweise weil es wirklich nicht eins ist, und teilweise weil es sich anfühlt, als würde es zu mehr Verwirrung führen, wenn es nicht mit abhängigen Typen arbeitet.

1

Das Data.Morphisms Modul bietet so etwas, außer dass Sie alle Umwicklungen/Entpackungen um den Morphism "newtype" vornehmen müssen.

+0

Dann könnte man etwas wie 'typeFold = foldr1 (~>)' verwenden –