Sto controllando che non ci sia una certa pratica corrente con Template-Haskell/some fanciness lenti a che fare con il semplice caso di:attuale best-practice per quanto riguarda record di namespacing globale
data Person = Person {
name :: String,
...
}
data Company = Company {
name :: String,
...
}
Attualmente sto evitando di inquinare lo spazio dei nomi globale qualificando l'importazione, ma rende l'accesso al record maldestro.
import Person as P
isFred :: Person -> Bool
isFred p = (P.name p) == "Fred"
Non esiste ancora un modo migliore per accedere ai campi dei record?
Sono accettare la risposta di @Emmanuel Touzery a causa del collegamento utile ad un'altra domanda che copre lo stesso terreno. L'altra domanda non viene visualizzata per una ricerca su "spazio dei nomi haskell". Niente di male con le altre risposte, ma posso solo accettare quella.
La soluzione menzionata qui utilizza Template Haskell, obiettivi, classi di tipi e altro per creare fondamentalmente un typeclass per ogni campo "HasName" con una singola funzione "nome". Ogni tipo di dati è quindi un'istanza di quella classe con la sua implementazione. Poi c'è un po 'di magia che non capisco completamente permettendo di coinvolgere diversi tipi.
Per i neofiti di Haskell che si chiedono di cosa si tratta, è perché i record sono fondamentalmente tuple con selettori di campo implementati come funzioni ordinarie che selezionano (ad es.) Il secondo elemento di quella tupla. Se si esportano queste funzioni di selezione dei campi, si siedono nello spazio dei nomi globale e prima o poi (di solito prima) si ottiene uno scontro.
Quindi - qualificate le importazioni (come nel mio esempio sopra) o provate a inventare nomi che non entrano in conflitto (prefissate il nome e sperate per il meglio).
Il materiale dell'obiettivo è di gran moda dal 2013 e consente la composizione di selettori di campo/getter + setter ecc. L'idea di base degli obiettivi non è troppo complicata ma l'implementazione mi passa per la testa.
Per la cronaca (ah!) Penso che la soluzione in un altro post è probabilmente quello che sto cercando, ma lo fa coinvolgere una grande quantità di magia (5 estensioni solo per finta namespacing record).
Tuttavia, nessuno di questi problemi risolve il problema. Sono solo diversi tipi di prefisso. Non è un problema in OO perché lo spazio dei nomi di metodi/attributi è limitato alla classe/oggetto - è comunemente solo lo spazio dei nomi di classe che è globale. Grazie comunque - l'ultima discussione che ho trovato su questo era di circa 18 mesi. –
I colloqui sull'implementazione di un sistema di registrazione migliore sono stati come sempre. Ci sono dozzine di soluzioni suggerite. Esistono anche [dialetti Haskell, che risolvono il problema] (http://en.wikipedia.org/wiki/Frege_ (programming_language) #Records). Sfortunatamente, non ci resta che attendere che qualcuno di questi venga implementato. –
Sì, ho passato in rassegna alcune delle discussioni più vecchie (sopra la mia testa). Ha la sensazione di uno di quei casi in cui aspetteremo la soluzione al 100% tra dieci anni, piuttosto che avere una soluzione al 90% anni fa. –