gpt4 book ai didi

haskell - 如何将 Aeson 的解析器与 IO 一起使用

转载 作者:行者123 更新时间:2023-12-01 09:15:00 25 4
gpt4 key购买 nike

我有许多字段的数据类型,如果不是由 JSON 配置文件手动指定,则应该随机设置。我正在使用 Aeson 来解析配置文件。做这个的最好方式是什么?

目前,我将值设置为等于某个不可能的值,然后稍后检查要编辑的值。

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'

我想要的是以下方面的内容:
parseJSON = withObject "Example" $ \v -> Example
<$> (v .: "a" <|> return (randomRIO (1,10))

是否可以在 IO Monad 中定义解析器或沿着某个随机生成器的线程,理想情况下使用 Aeson?

最佳答案

好吧,我不知道这是否是一个好主意,并处理额外的 IO对于更大的开发,层肯定会令人沮丧,但以下类型检查:

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Aeson
import System.Random

data Example = Example { a :: Int, b :: Int } deriving (Eq, Ord, Read, Show)

instance FromJSON (IO Example) where
parseJSON = withObject "Example" $ \v -> liftA2 Example
<$> ((pure <$> (v .: "a")) <|> pure (randomRIO (3, 4)))
<*> ((pure <$> (v .: "b")) <|> pure (randomRIO (5, 6)))

在最后两行的每一行中,第一个 pureInt -> IO Int ,第二个是 IO Int -> Parser (IO Int) .在ghci中:
> sequence (decode "{}") :: IO (Maybe Example)
Just (Example {a = 4, b = 6})

关于haskell - 如何将 Aeson 的解析器与 IO 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46820379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com