Haskell динамически устанавливает поле записи на основе строки имени поля?

Допустим, у меня есть следующая запись:

data Rec = Rec {
   field1 :: Int,
   field2 :: Int
}

Как мне написать функцию:

changeField :: Rec -> String -> Int -> Rec
changeField rec fieldName value 

такую, чтобы я мог передать строки "field1" или "field2" в аргумент fieldName и чтобы она обновила связанное поле? Я понимаю, что здесь нужно использовать Data.Data и Data.Typeable, но я не могу разобраться с этими двумя пакетами.


Примером библиотеки, которая, как я видел, делает это, является cmdArgs. Ниже приведен отрывок из статьи в блоге о том, как использовать эту библиотеку:

{-# 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

Теперь у нас есть простой парсер командной строки. Некоторые примеры взаимодействия:

$ guess --min=10
NumberGuess {min = 10, max = 100, limit = Nothing}

10
задан Chris Stryczynski 14 December 2017 в 18:57
поделиться