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}

Ответы на вопрос(2)

Ваш ответ на вопрос