2012-05-03 8 views
11

Ho letto su alcuni dei problemi con i record Haskell, in particolare, il fatto che due elementi nello stesso modulo non possono avere lo stesso nome.Haskell registra, approccio più pulito?

capisco è possibile aggirare questo avendo moduli separati, ma non ho voglia di farlo e invece provato questo approccio:

class HasX a where 
    x :: a -> X 

data D1 = D1 { d1_x :: X, ... } 
instance HasX D1 where 
    x = d1_x 

data D2 = D2 { d2_x :: X, ... } 
instance HasX D2 where 
    x = d2_x 

(Questo non solo ottiene, non imposta, mi piacerebbe ovviamente bisogno di scrivere più codice per fare serie).

Tuttavia, sembra che le dichiarazioni di classe e di istanza per tutto ciò sembrino simili a un boilerplate che dovrebbe poter essere eliminato, utilizzando template haskell o qualcos'altro.

C'è una libreria o un'estensione per GHC che rende questo approccio meno disordinato per scrivere?

+0

Sì, oops. Fisso. – Clinton

+1

È un po 'più complicato di così poiché i due campi potrebbero non avere lo stesso tipo. – augustss

+0

Per i miei scopi, supponiamo che i campi con lo stesso nome abbiano lo stesso tipo. Non avrò campi con lo stesso nome con tipi diversi. – Clinton

risposta

5

Sembra che Data.Has racchiuda molto di ciò che stai cercando. Nel loro vocabolario, ritengo che la loro classe di tipo Knows sia più vicina al tuo Has e fornisce anche una firma per l'iniezione.

Inoltre, utilizzano un meccanismo di etichettatura per trattare un problema che non penso abbia ancora preso in considerazione: record contenenti campi dello stesso tipo. Usano le etichette a livello di carattere per fare questa disambiguazione.

Per comodità, ci sembra anche essere un po 'di supporto che fornisce un generatore per l'istanza Has con il modello Haskell in Has-TH

Puoi trovare altre etichette tipo di livello e altro materiale di registrazione rilevanti nei lavori del Oleg il mago tipo, come OOHaskell (anche con Ralf Lämmel).

+0

Potresti indicarmi qualche documentazione di stile tutorial per 'Data.Has' (e' Has-TH' per quella materia). Sembra più o meno come quello che sto cercando, ma non sono sicuro di come mettere tutto insieme. – Clinton

+0

In realtà, ho trovato questo per 'Data.Has': https://github.com/nonowarn/has/blob/master/examples/Announce04.lhs – Clinton

0

modello di accesso ai dati può almeno aiutare a scrivere gli accessi set/get. Forse alcune persone possono trovare il codice Template Haskell per la generazione di classi e istanze per ogni nome di campo del record. Tuttavia, non uso io stesso la sostanza Template Haskell. Ti limita a GHC e anche a versioni specifiche di GHC, poiché Template Haskell cambia tra le diverse versioni di GHC. Avere un (maggiore) record per modulo è davvero redditizio.