1

通过 Haskell 工作,我正在尝试学习如何序列化到 JSON 或从 JSON 序列化。

我正在使用 aeson-0.8.0.2 并且我被困在基本解码上。这是我所拥有的:

文件游乐场/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] 编译主程序(playground/aeson.hs,playground/aeson.o)

游乐场/aeson.hs:13:35:不在范围内:`'

游乐场/aeson.hs:14:40:不在范围内:`<*>'

游乐场/aeson.hs:17:28:不在范围内:`mzero'

  1. 知道我做错了什么吗?
  2. 为什么这里需要 OverloadedString?
  3. 另外,我不知道<$>, <*>, ormzero应该是什么意思;我会很感激有关在哪里可以阅读有关这些内容的提示。
4

2 回答 2

1

您需要导入Control.ApplicativeControl.Monad获取<$>,<*>mzero. <$>只是fmap, and <*>is 的中缀操作Applicative符,你现在可以把它看成是 的更通用的形式fmapmzero是为类定义的MonadPlus,是表示aMonad有操作的类

mplus :: m a -> m a -> m a

还有一个叫做 . 的“一元零”元素mzero。最简单的例子是列表:

> mzero :: [Int]
[]
> [1, 2, 3] `mplus` [4, 5, 6]
[1, 2, 3, 4, 5, 6]

这里mzero被用来表示解析失败。为了将来查找符号,我建议使用hoogleFP Complete 的版本。找到符号后,请阅读文档、源代码,并在 Internet 上查找其使用示例。通过自己寻找它,你会学到很多东西,尽管你需要一点时间来适应这种研究。

这里OverloadedStrings需要扩展,因为Aeson库使用Textfrom 类型Data.Text而不是内置String类型。此扩展允许您使用字符串文字Text代替String,就像数字文字0可以是IntIntegerFloatDoubleComplex其他类型一样。 OverloadedStrings使字符串文字具有 typeText.String.IsString s => s而不是 just String,因此可以轻松使用备用 string-y 类型。

于 2014-11-18T16:33:07.473 回答
0

因为<$>你需要导入Control.Applicativemzero你需要导入Control.Monad.

您可以通过使用基于 Web 的 hoogle 版本 ( http://www.haskell.org/hoogle ) 或命令行版本来确定这一点:

$ hoogle '<$>'
$ hoogle mzero
于 2014-11-18T16:33:56.687 回答