作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有许多字段的数据类型,如果不是由 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
对于更大的开发,层肯定会令人沮丧,但以下类型检查:
{-# 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)))
pure
是
Int -> 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/
我是一名优秀的程序员,十分优秀!