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?
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. –
@EdwinBrady, grazie, accetto questo come risposta (o lo farei se fosse una risposta). –
Non mi sembra ancora una risposta adeguata ... Tornerò presto da te speriamo! –