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?
如果您使用fromJValue someValue某些表达式的一部分,Haskell将选择表达式所需的类型.所以如果你这样做:
case fromJValue someValue of
Right str -> putStr str
Left _ -> error
Run Code Online (Sandbox Code Playgroud)
JSON String选择实例是因为putStr需要一个字符串.
在所需要的类型不能明确确定的情况下,你会得到一个"暧昧类型变量"的错误,将不得不增加一个类型注释手动挑选要使用的实例.
请注意,哪种JValue someValue包含完全无关紧要.