Haskell aeson包的基本用法

时间:2014-11-18 16:17:47

标签: json haskell aeson

通过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'

  1. 知道我做错了吗?
  2. 为什么需要OverloadedString?
  3. 此外,我不知道<$><*>mzero应该是什么意思;我很欣赏有关这些内容的提示。

2 个答案:

答案 0 :(得分:1)

您需要导入Control.ApplicativeControl.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用于表示无法解析。要在将来查找符号,建议您使用hoogleFP Complete's version。找到符号后,请阅读文档,来源,并查看其在互联网上使用的示例。你会通过自己寻找它来学到很多东西,虽然你需要一段时间才能适应这种研究。

此处需要OverloadedStrings扩展名,因为Aeson库使用的是来自Text的{​​{1}}类型,而不是内置的Data.Text类型。此扩展名允许您将字符串文字用作String而不是Text,就像数字文字String可以是0Int,{{1}一样},IntegerFloat和其他类型。 Double使字符串文字的类型为Complex,而不仅仅是OverloadedStrings,因此可以轻松使用备用字符串-Y类型。

答案 1 :(得分:0)

对于<$>,您需要导入Control.Applicative;对于mzero,您需要导入Control.Monad

您可以使用基于网络的hoogle版本(http://www.haskell.org/hoogle)或命令行版本来确定:

$ hoogle '<$>'
$ hoogle mzero