我最近开始在我的一个项目中使用Data.Aeson。我最近也是Haskell的新手。所以我想弄清楚parseJSON
类型类中FromJSON
函数的实现是如何工作的。
所以我的代码库中有一段代码。
data MyProfile = MyProfile { name :: String, age :: Int } deriving Show
instance FromJSON MyProfile where
parseJSON (Object m) = MyProfile <$>
m .: "name" <*>
m .: "age"
parseJSON x = fail ("not an object: " ++ show x)
我想读的YAML文件也很简单。
profile:
name: "Foo"
age: 16
我正在努力了解该applicative functor的工作原理。我浏览了Data.Aeson模块,发现(。:)返回一个Parser(FromJSON a)。
所以我所理解的事实是,
profile:
部分MyProfile
对应profile
name
中的ParseJSON
正在尝试获取JSON对象中密钥的值m age
类似<*>
都会返回Parser (FromJSON)
,然后将其应用到下一个<*>
我不理解的是,
MyProfile
如何映射到profile
部分?如果我的程序中有一个巨大的yaml文件和多个数据,该怎么办?MyProfile <$> m .: "name"
中,<$>
的第一个参数不应该是函数吗?我认为<$>
与fmap类似,因此第一个参数必须是一个函数(应用于第二个参数)。但MyProfile是一个数据!混乱!如果我的任何理解有误,请纠正我。