Скажем, у меня есть следующая запись:
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}
gmapQi
или что-то подобное. (Вам нужно добавитьderiving (Typeable, Data)
к объявлению записи, чтобы это имело хоть какую-то надежду на работу; это невозможно сделать для произвольных типов.) - person ehird   schedule 28.12.2011recMap
из имен полей записи с помощью Template Haskell. - person ehird   schedule 28.12.2011recMap
; он более гибкий и менее волшебный. - person ehird   schedule 28.12.2011unsafeCoerce
для преобразования между целочисленными типами в Haskell ?, было бы упущением не указать, что вместо этого вы должны использоватьfromIntegral
; таким образом мои комментарии. - person ehird   schedule 29.12.2011