Dire che ho il seguente record:Haskell ha impostato dinamicamente il campo del record in base alla stringa del nome del campo?
data Rec = Rec {
field1 :: Int,
field2 :: Int
}
Come faccio a scrivere la funzione:
changeField :: Rec -> String -> Int -> Rec
changeField rec fieldName value
tale che posso passare in stringhe "campo1" o "field2" in l'argomento fieldName
e aggiornare il campo associato? Capisco Data.Data
e Data.Typeable
sono cosa usare qui, ma non riesco a capire questi due pacchetti.
Un esempio di libreria che ho visto fare questo è cmdArgs. Qui di seguito è un excerpt da un post sul blog su come usare questa libreria:
{-# LANGUAGE DeriveDataTypeable #-}
import System.Console.CmdArgs
data Guess = Guess {min :: Int, max :: Int, limit :: Maybe Int} deriving (Data,Typeable,Show)
main = do
x <- cmdArgs $ Guess 1 100 Nothing
print x
Ora abbiamo un parser semplice riga di comando. Alcune interazioni di esempio sono:
$ guess --min=10
NumberGuess {min = 10, max = 100, limit = Nothing}
Probabilmente non vuoi farlo. Hai sentito parlare di [obiettivi] (http://stackoverflow.com/questions/5767129/lenses-fclabels-data-accessor-which-library-for-structure-access-and-mutatio)? Penso che l'unico modo per ottenere questo risultato sarebbe un trucco che coinvolga l'associazione di nomi di campi con i loro indici di argomenti e l'uso di 'gmapQi' o simili. (Dovresti aggiungere 'derivando (Typeable, Data)' alla tua dichiarazione di registrazione per questo per avere qualche speranza di lavorare, non può essere fatto per tipi arbitrari.) – ehird
Voglio farlo. Mi piacerebbe creare una libreria in cui l'utente può fornire un record e la libreria può popolare il record analizzando del testo. Il testo conterrà i riferimenti al campo nel record che voglio impostare. – Ana
È meglio evitare di legare l'implementazione di questa funzionalità rivolta all'utente ai dettagli di implementazione interni dei nomi dei campi dei record. Ho suggerito la soluzione basata su obiettivi @pat; puoi automatizzare la creazione di 'recMap' dai nomi dei campi dei record con Template Haskell. – ehird