在Haskell中进行JSON解析期间的重载分辨率

Ral*_*lph 0 parsing haskell overloading typeclass

我正在阅读"真实世界Haskell"(好书),我对编译器如何选择重载函数感到困惑.

如果我有一个类型类

type JSONError = String

class JSON a where
    toJValue :: a -> JValue
    fromJValue :: JValue -> Either JSONError a
Run Code Online (Sandbox Code Playgroud)

和这样的两个实例

instance JSON Bool where
    toJValue = JBool
    fromJValue (JBool b) = Right b
    fromJValue _ = Left "not a JSON boolean"
Run Code Online (Sandbox Code Playgroud)

instance JSON String where
    toJValue = JString
    fromJValue (JString s) = Right s
    fromJValue _ = Left "not a JSON string"
Run Code Online (Sandbox Code Playgroud)

编译器如何在两个"fromJValue"函数之间进行选择,例如,给出一个Integer?

sep*_*p2k 6

如果您使用fromJValue someValue某些表达式的一部分,Haskell将选择表达式所需的类型.所以如果你这样做:

case fromJValue someValue of 
    Right str -> putStr str
    Left _ -> error
Run Code Online (Sandbox Code Playgroud)

JSON String选择实例是因为putStr需要一个字符串.

在所需要的类型不能明确确定的情况下,你会得到一个"暧昧类型变量"的错误,将不得不增加一个类型注释手动挑选要使用的实例.

请注意,哪种JValue someValue包含完全无关紧要.