通过Haskell工作,我正在尝试学习如何序列化到/来自JSON。
我正在使用aeson-0.8.0.2&我坚持基本的解码。这就是我所拥有的:
file playground / aeson.hs:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text
import Data.Aeson
data Person = Person
{ name :: Text
, age :: Int
} deriving Show
instance FromJSON Person where
parseJSON (Object v) = Person <$>
v .: "name" <*>
v .: "age"
parseJSON _ = mzero
main = do
let a = decode "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person
print "aa"
ghc --make playground / aeson.hs产量:
[1 of 1]编译Main(playground / aeson.hs, playground / aeson.o)
playground / aeson.hs:13:35:不在范围内:`'
playground / aeson.hs:14:40:不在范围内:`&lt; *&gt;'
playground / aeson.hs:17:28:不在范围内:`mzero'
<$>
,<*>
或mzero
应该是什么意思;我很欣赏有关这些内容的提示。答案 0 :(得分:1)
您需要导入Control.Applicative
和Control.Monad
才能获得<$>
,<*>
和mzero
。 <$>
只是fmap
的中缀运算符,<*>
是Applicative
运算符,您现在可以将其视为fmap
的更通用形式。为mzero
类定义MonadPlus
,该类是表示Monad
具有操作的类
mplus :: m a -> m a -> m a
一个名为mzero
的“monadic zero”元素。最简单的例子是列表:
> mzero :: [Int]
[]
> [1, 2, 3] `mplus` [4, 5, 6]
[1, 2, 3, 4, 5, 6]
此处mzero
用于表示无法解析。要在将来查找符号,建议您使用hoogle或FP Complete's version。找到符号后,请阅读文档,来源,并查看其在互联网上使用的示例。你会通过自己寻找它来学到很多东西,虽然你需要一段时间才能适应这种研究。
此处需要OverloadedStrings
扩展名,因为Aeson
库使用的是来自Text
的{{1}}类型,而不是内置的Data.Text
类型。此扩展名允许您将字符串文字用作String
而不是Text
,就像数字文字String
可以是0
,Int
,{{1}一样},Integer
,Float
和其他类型。 Double
使字符串文字的类型为Complex
,而不仅仅是OverloadedStrings
,因此可以轻松使用备用字符串-Y类型。
答案 1 :(得分:0)
对于<$>
,您需要导入Control.Applicative
;对于mzero
,您需要导入Control.Monad
。
您可以使用基于网络的hoogle版本(http://www.haskell.org/hoogle)或命令行版本来确定:
$ hoogle '<$>'
$ hoogle mzero