C'è una biblioteca che utilizza costrizione per generalizzare tutte le classi di tipo base per consentire i vincoli?
-
12-12-2019 - |
Domanda
Possiamo utilizzare il vincolo di estensione per estendere la funzionalità delle classi di tipo base per consentire vincoli.Ad esempio, possiamo creare un functore Unboxed a functor:
class Functor f where
type FunctorConstraint f x :: Constraint
type FunctorConstraint f x = ()
fmap :: (FunctorConstraint f a, FunctorConstraint f b) => (a -> b) -> f a -> f b
instance Functor VU.Vector where
type FunctorConstraint VU.Vector x = VU.Unbox x
fmap = VU.map
.
(vedi questi Blog Posts per ulteriori dettagli).
Mi sono notato di implementare una parte piuttosto ampia delle classi di tipo della biblioteca di base in questo nuovo stile (in pratica voglio essere in grado di lavorare in modo intercambiabile tra vettori ed elenchi non scaduti), e mi chiedo se una libreria per questo esiste giàDovrei usare, o se dovrei andare fuori e aggiungerlo all'hackage.
.
Modifica: Inoltre, ci sono piani per aggiungerlo direttamente alla base?Sembra che non dovrebbe infrangere nient'altro solo aggiornando direttamente le definizioni di classe.
Soluzione
Dato che sembra che nessun altro abbia una biblioteca, ho convertito ciò che ho fatto in un progetto separato chiamato costriintkinds e Lo ha caricato a GitHub .È estremamente semplice al momento e probabilmente non copre ancora il caso di uso di nessun altro, ma non esitare a creare le tue modifiche o inviare richieste.
Probabilmente aspetterò più feedback su se questa è una buona direzione prima di caricare il progetto all'hackage.