Decir que tengo el siguiente registro:Haskell establece dinámicamente el campo de registro en función de la cadena de nombre de campo?
data Rec = Rec {
field1 :: Int,
field2 :: Int
}
¿Cómo se escribe la función:
changeField :: Rec -> String -> Int -> Rec
changeField rec fieldName value
tal que me puede pasar en las cadenas "campo1" o "campo2" en el argumento fieldName
y ¿ha actualizado el campo asociado? Entiendo que Data.Data
y Data.Typeable
son los que debo usar aquí, pero no puedo entender estos dos paquetes.
Un ejemplo de una biblioteca que he visto hacer esto es cmdArgs. A continuación se muestra un excerpt de una entrada de blog sobre el uso de esta biblioteca:
{-# 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
Ahora tenemos un analizador simple línea de comandos. Algunas reacciones de la muestra son:
$ guess --min=10
NumberGuess {min = 10, max = 100, limit = Nothing}
Probablemente no desee hacer esto. ¿Has oído hablar de [lentes] (http://stackoverflow.com/questions/5767129/lenses-fclabels-data-accessor-which-library-for-structure-access-and-mutatio)? Creo que la única manera de lograr esto sería un truco que involucre emparejar nombres de campo con sus índices de argumento y usar 'gmapQi' o similar. (Necesitaría agregar 'derivación (Typeable, Data)' a su declaración de registro para que esto tenga alguna esperanza de funcionar, no se puede hacer para tipos arbitrarios). – ehird
Sí quiero hacer esto. Me gustaría crear una biblioteca donde el usuario pueda proporcionar un registro, y la biblioteca puede llenar el registro analizando algún texto. El texto contendrá referencias al campo en el registro que quiero establecer. – Ana
Es mejor evitar vincular la implementación de esta funcionalidad orientada al usuario a los detalles de la implementación interna de los nombres de los campos de registro. En segundo lugar sugiero la solución basada en lentes; podría automatizar la creación de 'recMap' a partir de nombres de campo de registro con Template Haskell. – ehird