Con il pacchetto dell'obiettivo stavo codificando. Tutto stava andando bene fino a quando ho provato ad accedere a un determinato campo su un tipo algebrico:Pacchetto di lenti con tipi algebrici
import Control.Lens
data Type = A { _a :: Char } | B
makeLenses ''Type
test1 = _a (A 'a')
test2 = (A 'a') ^. a
No instance for (Data.Monoid.Monoid Char)
arising from a use of `a'
Possible fix:
add an instance declaration for (Data.Monoid.Monoid Char)
In the second argument of `(^.)', namely `a'
In the expression: (A 'a') ^. a
In an equation for `test2': test2 = (A 'a') ^. a
ho potuto solo andare con _A, ma il tipo di dati nel mio programma reale è molto più profondo e mi sono inteso sull'uso di lenti a ridurre la quantità di lavoro che devo fare. Ho esaminato la libreria degli obiettivi, ma c'è così tanto, e non sono sicuro che abbia affrontato questo scenario o sia qualcosa che la libreria di obiettivi non supporta.
Come nota a margine, se effettivamente uso una stringa monoide come il tipo di dati anziché Char, quindi compila e fornisce la risposta corretta, non ho idea del perché.
Edit: Dopo aver letto il commento di Hammar, ho provato questo e questo funziona:
test2 = (A 'a') ^? a
test3 = B ^? a
Ma è un po 'strano per ottenere un forse da quella per qualcosa che deve esistere.
Non troppo familiare con il funzionamento interno del pacchetto dell'obiettivo, ma: Considerare cosa 'B ^. a' dovrebbe tornare. Deve scegliere qualcosa, quindi cerca di usare 'mempty' come default invece di lanciare un'eccezione come' _a B' fa. – hammar
Non avevo idea che _a B si sarebbe compilato. Ho avuto un bug nel mio codice che non avrei realizzato se non ci fosse stato runtime e non ci sono stati avvertimenti nemmeno con Wall. Quindi, suppongo che userò ^? e forse la funzione e questo fa esattamente quello di cui ho bisogno. –
In realtà, ripensandoci, sono giunto alla conclusione che i metodi di accesso ai tipi algebrici sono solo una cattiva idea. Sono sorpreso che sia persino permesso. Ho avuto così tanti bug nel mio programma che ho appena ripulito. –