2015-05-16 8 views
9

Come so, il -> ha tipo *->*->*, e il ((->) r) ha tipo *->*.Il tipo letterale in Haskell

Supponendo che esista un tipo (a->b->c), esiste un modo per rappresentare lo (a->b->)?

Ho provato ((->) a ((->) b)) ma è un errore.

ho provato:

type Kab a b c = (a -> b -> c) -- it is ok 

Ma è riuscito a utilizzare il Kab in dichiarazione di istanza:

instance KClass (Kab a b) where -- error 

L'unico modo che ho trovato che funziona è dichiarare un data:

data Kab a b c = Kab (a -> b -> c) 
instance KClass (Kab a b) where .. 

Ma se uso i dati, devo scartare lo Kab, mentre la mia idea è di implementare un KClass sul tipo di funzione nativa.

Quindi come si fa?

risposta

10

Non può essere fatto, sfortunatamente.

Si potrebbe desiderare "lambda di tipo di livello" (scriviamole /\); allora saresti in grado di scrivere forall a b. /\c. a -> b -> c per darti questo. Questa sarebbe una caratteristica molto utile, e ci sono stati molti studi sui sistemi di tipi che consentono questo, ma il prezzo da pagare è che l'inferenza di tipo diventa indecidibile. Quindi il comitato di Haskell ha deciso di saltarlo.

+1

* Così il comitato di Haskell ha deciso di saltarlo. * Potresti aggiungere qualche riferimento per questo? – Jubobs

+1

@Jubobs Non sono sicuro di cosa vogliate vedere qui. Non ci sono lambda di livello tipo nel Rapporto; ma non è che ci sia una sezione specifica in cui non sono o qualcosa del genere. –

+2

L'inferenza di tipo con lambdas di tipo è decidibile per il frammento di modello di Miller, che include tutte le cose che abbiamo con i costruttori di tipo Haskell correnti. Penso che sia meglio dire che non abbiamo type lambda in Haskell perché non ce n'è stato molto bisogno e la tipizzazione dipendente è stata uno spazio di progettazione sperimentale fino a poco tempo fa. –