2014-04-05 16 views
29

posso fare solo i tipi di rango-n in Idris 0.9.12 in un modo piuttosto goffo:Facendo rango-n quantificazione in Idris

tupleId : ((a : Type) -> a -> a) -> (a, b) -> (a, b) 
tupleId f (a, b) = (f _ a, f _ b) 

ho bisogno di sottolineature dove c'è un tipo di applicazione, perché Idris getta analizzare errori quando provo a fare il (nested) tipo argomenti implicita:

tupleId : ({a : Type} -> a -> a) -> (a, b) -> (a, b) -- doesn't compile 

Una questione probabilmente più grande è che non posso fare vincoli di classe nei tipi più alto rango a tutti. Non posso tradurre la seguente funzione Haskell Idris:

appShow :: Show a => (forall a. Show a => a -> String) -> a -> String 
appShow show x = show x 

Questo mi impedisce anche di utilizzare le funzioni Idris come sinonimi tipo per tipi come Lens, che è Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t in Haskell.

Un modo per ovviare o aggirare i suddetti problemi?

+14

E 'sulla mia lista TODO - normalmente le cose salgono sulla lista dei TODO se qualcun altro chiede di loro, quindi basta chiedere questo è un modo per aiutarlo a rimediare :). Sorprendentemente, non c'è stata molta richiesta per questo, anche se ovviamente sarebbe stato bello. C'è qualche inganno nell'ottenere argomenti impliciti giusti, quindi per il momento abbiamo adottato un approccio piuttosto semplice. Le classi di tipi sono di prima classe, quindi esiste anche un modo maldestro per eseguire i vincoli di classe: trattarli come normali argomenti di funzione e utilizzare '% instance' per trovare esplicitamente l'istanza. –

+0

@EdwinBrady, grazie, accetto questo come risposta (o lo farei se fosse una risposta). –

+0

Non mi sembra ancora una risposta adeguata ... Tornerò presto da te speriamo! –

risposta

18

Ho appena implementato questo in master, consentendo impliciti in ambiti arbitrari, e sarà nella prossima versione di hackage. Tuttavia non è ancora ben collaudato! Ho provato, almeno le seguenti semplici esempi, e pochi altri:

appShow : Show a => ({b : _} -> Show b => b -> String) -> a -> String 
appShow s x = s x 

AppendType : Type 
AppendType = {a, n, m : _} -> Vect n a -> Vect m a -> Vect (n + m) a 

append : AppendType 
append [] ys = ys 
append (x :: xs) ys = x :: append xs ys 

tupleId : ({a : _} -> a -> a) -> (a, b) -> (a, b) 
tupleId f (a, b) = (f a, f b) 

Proxy : Type -> Type -> Type -> Type -> (Type -> Type) -> Type -> Type 

Producer' : Type -> (Type -> Type) -> Type -> Type 
Producer' a m t = {x', x : _} -> Proxy x' x() a m t 

yield : Monad m => a -> Producer' a m() 

Il vincolo principale al minuto è che non si può dare valori per gli argomenti impliciti direttamente, se non a livello superiore. Alla fine ne farò qualcosa ...

+1

Anche le lezioni di tipo avranno luogo? – dfeuer