Работаю через Haskell, и я пытаюсь научиться сериализовать в / из 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 plays / aeson.hs дает:

[1 из 1] Основная часть компиляции (игровая площадка / aeson.hs, игровая площадка / aeson.o)

игровая площадка / aeson.hs: 13: 35: Не входит в объем: `'

игровая площадка / aeson.hs: 14: 40: Не входит в область: `<*> '

игровая площадка / aeson.hs: 17: 28: Не входит в объем: `mzero '

  1. Есть идеи, что я делаю не так?
  2. Зачем здесь нужна OverloadedString?
  3. Кроме того, я понятия не имею, что должны означать <$>, <*> или mzero; Буду признателен за советы о том, где я могу прочитать об этом.
1
adizere 18 Ноя 2014 в 19:17

2 ответа

Лучший ответ

Вам необходимо импортировать Control.Applicative и Control.Monad, чтобы получить <$>, <*> и mzero. <$> просто инфиксный оператор для fmap, а <*> - оператор Applicative, на данный момент вы можете рассматривать его как более обобщенную форму fmap. mzero определен для класса MonadPlus, который представляет собой класс, представляющий, что Monad выполняет операцию

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

И элемент «монадический ноль», называемый mzero. Самый простой пример - для списков:

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

Здесь mzero используется для обозначения сбоя синтаксического анализа. Для поиска символов в будущем я рекомендую использовать hoogle или Версия FP Complete. Как только вы найдете символ, прочтите документацию, исходный код и поищите примеры его использования в Интернете. Вы многому научитесь, ища его самостоятельно, хотя вам потребуется некоторое время, чтобы привыкнуть к такого рода исследованиям.

Расширение OverloadedStrings здесь необходимо, потому что библиотека Aeson работает с типом Text из Data.Text вместо встроенного типа String. Это расширение позволяет использовать строковые литералы как Text вместо String, так же как числовой литерал 0 может быть Int, Integer, Float, Double, Complex и другие типы. OverloadedStrings заставляет строковые литералы иметь тип Text.String.IsString s => s вместо простого String, что упрощает использование альтернативных строковых типов y.

1
bheklilr 18 Ноя 2014 в 16:33

Для <$> вам необходимо импортировать Control.Applicative, а для mzero вам необходимо импортировать Control.Monad.

Вы можете определить это с помощью веб-версии hoogle ( http://www.haskell.org/hoogle) или версию командной строки:

$ hoogle '<$>'
$ hoogle mzero
0
ErikR 18 Ноя 2014 в 16:33