我如何使用json库?

时间:2010-12-24 00:59:17

标签: json haskell

我正在试图找出Haskell的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 个答案:

答案 0 :(得分:7)

您需要指定要返回的类型,如下所示:

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

如果该行是较大程序的一部分,你继续使用decode的结果,可以推断出类型,但由于ghci不知道你需要哪种类型,它不能推断它。

这就是为什么read "[1,2,3]"在没有类型注释或更多上下文的情况下无效的原因。

答案 1 :(得分:4)

解码功能定义如下:

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

但是,在GHCi中使用decode时,必须指定值的类型,例如:

decode "6" :: Result Int
=> Ok 6

答案 2 :(得分:2)

快速浏览文档似乎表明此函数的目的是允许您将JSON读入任何受支持类型的Haskell数据结构中,所以

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

应该工作