Скажем, у меня есть следующая запись:
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}