Как мне использовать библиотеку JSON? - PullRequest
5 голосов
/ 24 декабря 2010

Я пытаюсь выяснить библиотеку Хаскелла json . Тем не менее, я столкнулся с небольшой проблемой в ghci:

Prelude> import Text.JSON
Prelude Text.JSON> decode "[1,2,3]"

<interactive>:1:0:
    Ambiguous type variable `a' in the constraint:
      `JSON a' arising from a use of `decode' at <interactive>:1:0-15
    Probable fix: add a type signature that fixes these type variable(s)

Я думаю, что это как-то связано с a в сигнатуре типа:

decode :: JSON a => String -> Result a

Может ли кто-нибудь показать мне:

  1. Как декодировать строку?
  2. Что здесь с системой типов?

Ответы [ 3 ]

7 голосов
/ 24 декабря 2010

Вам нужно указать, какой тип вы хотите вернуть, например:

decode "[1,2,3]" :: Result [Integer]
-- Ok [1,2,3]

Если бы эта строка была частью более крупной программы, в которой вы бы продолжили и использовали результат decode,Тип может быть просто выведен, но поскольку ghci не знает, какой тип вам нужен, он не может определить его.

По той же причине, почему read "[1,2,3]" не работает без аннотации типа или дополнительного контекста.

4 голосов
/ 24 декабря 2010

Функция декодирования определяется следующим образом:

decode :: JSON a => String -> Result a

В реальной программе механизм определения типов обычно может определить, какой тип ожидать от декодирования.Например:

userAge :: String -> Int
userAge input = case decode input of
                  Result a -> a
                  _ -> error $ "Couldn't parse " ++ input

В этом случае тип userAge заставляет средство проверки типов сделать вывод, что возвращаемое значение декодирования в данном конкретном случае равно Result Int.

когда вы используете decode в GHCi, вы должны указать тип значения, например:

decode "6" :: Result Int
=> Ok 6
2 голосов
/ 24 декабря 2010

Быстрый взгляд на документы показывает, что цель этой функции - позволить вам читать JSON в любую структуру данных Haskell поддерживаемого типа, поэтому

decode "[1, 2, 3]" :: Result [Int]

должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...