J'ai des types de données avec de nombreux champs qui, s'ils ne sont pas spécifiés manuellement par un fichier de configuration JSON, doivent être définis au hasard. J'utilise Aeson pour analyser le fichier de configuration. Quelle est la meilleure façon de procéder?Comment utiliser les analyseurs d'Aeson avec IO
Actuellement, je mets des valeurs égales à une valeur impossible, puis je vérifie plus tard la valeur à éditer.
data Example = Example { a :: Int, b :: Int }
default = Example 1 2
instance FromJSON Example where
parseJSON = withObject "Example" $ \v -> Example
<$> (v .: "a" <|> return (a default))
<*> (v .: "b" <|> return (b default))
initExample :: Range -> Example -> IO Example
initExample range (Example x y) = do
a' <- if x == (a default) then randomIO range else return x
b' <- if y == (b default) then randomIO range else return y
return $ Example a' b'
Ce que je voudrais est quelque chose le long des lignes de:
parseJSON = withObject "Example" $ \v -> Example
<$> (v .: "a" <|> return (randomRIO (1,10))
Est-il possible de définir Parsers dans le IO Monade ou d'un fil le long de certains générateur aléatoire, en utilisant idéalement Aeson?
Comme mentionné par @danidiaz, il utilise essentiellement les instances 'Applicative' et' Alternative' pour 'Compose Parser IO'. On pourrait soit utiliser directement ce type, soit l'utiliser comme guide supplémentaire pour écrire un tel code dans des développements plus importants. –