Hi,

thanks for the answer. This is my first attempt at Typeclasses, and I think there is something "deep" that I don't understand...

On 26/07/10 15:03, Daniel Fischer wrote:
class JSON a where
      toJValue :: a ->  JValue
      fromJValue :: JValue ->  Either JSONError a

instance JSON JValue where
      toJValue = id
      fromJValue = Right

instance JSON Bool where
      toJValue = JBool
      fromJValue (JBool b) = Right b
      fromJValue _ = Left "not a JSON boolean"


I don't understand how the JSON typeclass is defined, in particular the
fromJValue definition.

Given a JValue and a type
(like Bool, JValue, String, Maybe [(Integer, ())]), fromJValue returns
either

a JValue and a type???

For instance, when defining the instance for Bool types, then I
understand that both functions (toJValue and fromJValue) will be called
upon when we supply a Bool type, but then the (JBool b) type in function
fromJValue doesn't match....

fromJValue always takes a JValue as argument. That JValue can be a wrapped
String, a wrapped Bool, a wrapped number (Double), ...

so, fromJValue takes a JValue and a type, or only a JValue? I was assuming the second, but then my misunderstanding kicks in, I guess. I'll try to explain myself. When defining

class JSON a [...], then I thought that for an instance I would have to identify the type of that instance and that all functions would work on that type. Thus, when defining

instan JSON Bool [...] I was expecting that all the function definitions would have as argument a Bool. toJValue is no problem there, but I don't see the fromJValue definition, since this matches against either (JBool b) or _ , but not a Bool...

Another misunderstading on my side: if I call fromJValue (JBool True), which instance ofr fromJValue should be used: instance JSON JValue or instance JSON Bool. If we only look at the signature of the fromJValue functions, then both could match?

*Main>  fromJValue False

<interactive>:1:11:
      Couldn't match expected type `JValue' against inferred type `Bool'
      In the first argument of `fromJValue', namely `False'
      In the expression: fromJValue False
      In the definition of `it': it = fromJValue False

That one should be pretty clear, fromJValue expects a JValue as argument
and gets a Bool, it's like calling

Yes, but I guess you see why I try this given my misunderstanding above?

*Main>  fromJValue (JBool False)

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

That's less easy.
The compiler/interpreter doesn't know which result type to use.

fromJValue :: JSON a =>  JValue ->  Either JSONError a

with which type should a be instantiated, should it use
- JValue, in which case the result would be
Right (JBool False)

- Bool, in which case the result would be
Right False

- String, in which case the result woulde be something like
     No instance for (JValue [Char])
       arising from a use of `fromJValue' at ...

(unless you have such an instance in scope, then it would be something like
Left "not a JSON string")

- Int, in which case you'd get analogous behaviour
- ...




Any pointers?

In an actual programme, there is usually enough context to fix the type
variable a, then the compiler/interpreter knows what to do.
At the prompt or when there isn't enough context otherwise, you need to
explicitly tell the compiler/interpreter which type to use,

*Main>  fromJValue (JBool False) :: Either JSONError Bool
Right False
*Main>  fromJValue (JBool False) :: Either JSONError JValue
Right (JBool False)

Ah... OK, I think with these two examples the whole thing starts to make sense.

When defining

instance JSON Bool

then this doesn't mean that the functions need to work just on Bool's, but rather that wherever there is an "a" in the typeclass definition, then this should be instantiated to a Bool, correct?



And now that we are at it... In the next page, 152 there is the following instance definition, but no explanation is (I think) given of what it means:

instance (JSON a) => JSON [a] where

until then all instance definitions where of the type

instance JSON Int where ...

How should I read that definition?

Thanks for you help,
Ángel de Vicente
--
http://www.iac.es/galeria/angelv/

High Performance Computing Support PostDoc
Instituto de Astrofísica de Canarias
---------------------------------------------------------------------------------------------
ADVERTENCIA: Sobre la privacidad y cumplimiento de la Ley de Protección de 
Datos, acceda a http://www.iac.es/disclaimer.php
WARNING: For more information on privacy and fulfilment of the Law concerning 
the Protection of Data, consult http://www.iac.es/disclaimer.php?lang=en

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to