2012-03-08 12 views
8

Fondamentalmente, dato {-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-} (e altro, se necessario), l'operatore di tipo livello (~) funziona con le espressioni di tipo livello Constraint? Ho cercato su Google la risposta, ma non ho avuto fortuna.Uguaglianza sui vincoli

+1

La domanda è strana, ma ha chiesto bene. Per curiosità, cosa faresti con un vincolo di uguaglianza? –

+0

@Daniel Wagner Sto scrivendo un EDSL cross-paradigma che utilizza un sistema di funzioni generico e, per vari motivi, non posso utilizzare direttamente le classi di tipi. Potrei fare a meno di non usarlo, ma porterebbe a tipi estremamente goffi e forse alcune restrizioni inutili –

risposta

6

Sì, è possibile. Poiché i tipi di tipo Constraint sono insiemi finiti di vincoli di tipo atomico, è possibile testare la loro uguaglianza molto facilmente.

L'estensione PolyKinds non è necessaria, tuttavia. Inoltre, ci sono poche situazioni in cui questa uguaglianza gentile sarebbe effettivamente utile, perché non vedo un modo pratico per superare i vincoli polimorfici come gli argomenti c1, c2 a Bla, quindi l'uguaglianza dei vincoli sarebbe una tautologia in ogni caso (Show ~ Show qui):

{-# LANGUAGE ConstraintKinds, TypeFamilies #-} 

type Bla c1 c2 a = (c1 a, c2 a, c1 ~ c2) 

foo :: Bla Show Show a => a -> IO() 
foo = print 

main = foo "Bla"