我正在试图找出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
有人能告诉我:
答案 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]
应该工作