How to "cast" FromJSON instance value

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Baa
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

How to "cast" FromJSON instance value

Baa
Hello, List!

I have, for example, function with signature like

  fn :: FromJSON a => Map Text a -> BlahBlah

and I want to treat this `a` as String (or `Text`), to read it with
`readMaybe`. Am I right that it's impossible? I get error about "...a
is rigid type and could not be matched with Text...". But `Text` is
`FromJSON` instance. Is it possible to do it (cast, convert, unwrap, etc)?

The problem's source is that early I worked with `Text` values only
(getting from HTML form) but now they become any type: int's, bool's,
etc).

===
Best regards,
  Paul
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to "cast" FromJSON instance value

Jan von Löwenstein
Hi,

You don't know anything about your a's but that they have FromJSON instances. That in turn means you can get values from aeson parsing functions. Think parseJSON :: Value -> Parser a

Could you be more specific about the problem you try to solve? 

Best
Jan

Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 10:32:
Hello, List!

I have, for example, function with signature like

  fn :: FromJSON a => Map Text a -> BlahBlah

and I want to treat this `a` as String (or `Text`), to read it with
`readMaybe`. Am I right that it's impossible? I get error about "...a
is rigid type and could not be matched with Text...". But `Text` is
`FromJSON` instance. Is it possible to do it (cast, convert, unwrap, etc)?

The problem's source is that early I worked with `Text` values only
(getting from HTML form) but now they become any type: int's, bool's,
etc).

===
Best regards,
  Paul
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Baa
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to "cast" FromJSON instance value

Baa
Hello, Jan! I "remove" the question :)
Problem was: reading of HTML form values, which can be any type and
saving them in a map. I done it w/ `Map Text Value` (instead of previous
`Map Text Text`). To get values from the map, I implemented class and
several instances which returns values of different types, something
like:

  class GetValue a where
    getValue :: Text -> Map Text Value -> a

(promoting of `a` anywhere in the existing code needs big refactoring,
so map's value is `::Value` but not `::a`). Cons is a need to implement
N instances of `GetValue`: one per getting type.

Anywhere, Jan, thanks for quick answer, I'm sorry for this stupid
question.


> Hi,
>
> You don't know anything about your a's but that they have FromJSON
> instances. That in turn means you can get values from aeson parsing
> functions. Think parseJSON :: Value -> Parser a
> Could you be more specific about the problem you try to solve?
>
> Best
> Jan
>
> Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 10:32:
>
> > Hello, List!
> >
> > I have, for example, function with signature like
> >
> >   fn :: FromJSON a => Map Text a -> BlahBlah
> >
> > and I want to treat this `a` as String (or `Text`), to read it with
> > `readMaybe`. Am I right that it's impossible? I get error about
> > "...a is rigid type and could not be matched with Text...". But
> > `Text` is `FromJSON` instance. Is it possible to do it (cast,
> > convert, unwrap, etc)?
> >
> > The problem's source is that early I worked with `Text` values only
> > (getting from HTML form) but now they become any type: int's,
> > bool's, etc).
> >
> > ===
> > Best regards,
> >   Paul
> > _______________________________________________
> > Beginners mailing list
> > [hidden email]
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >  

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to "cast" FromJSON instance value

Jan von Löwenstein

You'd still have to handle the case that the Value is not what you expected. Otherwise you'll have a partial function (i.e. error in case of certain inputs).

So maybe you'd best use aeson directly (which spares you the GetValue instances as well).

getValue :: (FromJSON a) => Text -> Map Text a -> Maybe a

Best
Jan
P.S. There is no such thing as a stupid question.


Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 13:02:
Hello, Jan! I "remove" the question :)
Problem was: reading of HTML form values, which can be any type and
saving them in a map. I done it w/ `Map Text Value` (instead of previous
`Map Text Text`). To get values from the map, I implemented class and
several instances which returns values of different types, something
like:

  class GetValue a where
    getValue :: Text -> Map Text Value -> a

(promoting of `a` anywhere in the existing code needs big refactoring,
so map's value is `::Value` but not `::a`). Cons is a need to implement
N instances of `GetValue`: one per getting type.

Anywhere, Jan, thanks for quick answer, I'm sorry for this stupid
question.


> Hi,
>
> You don't know anything about your a's but that they have FromJSON
> instances. That in turn means you can get values from aeson parsing
> functions. Think parseJSON :: Value -> Parser a
> Could you be more specific about the problem you try to solve?
>
> Best
> Jan
>
> Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 10:32:
>
> > Hello, List!
> >
> > I have, for example, function with signature like
> >
> >   fn :: FromJSON a => Map Text a -> BlahBlah
> >
> > and I want to treat this `a` as String (or `Text`), to read it with
> > `readMaybe`. Am I right that it's impossible? I get error about
> > "...a is rigid type and could not be matched with Text...". But
> > `Text` is `FromJSON` instance. Is it possible to do it (cast,
> > convert, unwrap, etc)?
> >
> > The problem's source is that early I worked with `Text` values only
> > (getting from HTML form) but now they become any type: int's,
> > bool's, etc).
> >
> > ===
> > Best regards,
> >   Paul
> > _______________________________________________
> > Beginners mailing list
> > [hidden email]
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Baa
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to "cast" FromJSON instance value

Baa
Ohh, pardon! Yes, signature was

  class GetValue a where
    getValue :: Text -> Map Text Value -> Maybe a

with `Maybe` sure. But I didn't understand you: what do you mean "to
use aeson directly"? Problem is to save `FromJSON a` instances in map
but get from the map `Text`, `Bool` and etc values. Sure, it possible
to parameterize all related functions/types with `FromJSON a => .. a`
but in this case I hit 2 problems:

1. rigid type error when I have `FromJSON a =>` in some signature and
   try to use this `a` as `Text` value, for example
2. big refactoring (many signatures, types)

So, I decided to save in the map `Value`s instead of `FromJSON a`s.
De-facto, this map is heterogenous and keeps values of different types.
And question for me was: to hide this fact under `FromJSON` or under
`Value`. I'm not sure what is the best solution and I don't know how to
solve 1.


> You'd still have to handle the case that the Value is not what you
> expected. Otherwise you'll have a partial function (i.e. error in
> case of certain inputs).
>
> So maybe you'd best use aeson directly (which spares you the GetValue
> instances as well).
>
> getValue :: (FromJSON a) => Text -> Map Text a -> Maybe a
>
> Best
> Jan
> P.S. There is no such thing as a stupid question.
>
> Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 13:02:
>
> > Hello, Jan! I "remove" the question :)
> > Problem was: reading of HTML form values, which can be any type and
> > saving them in a map. I done it w/ `Map Text Value` (instead of
> > previous `Map Text Text`). To get values from the map, I
> > implemented class and several instances which returns values of
> > different types, something like:
> >
> >   class GetValue a where
> >     getValue :: Text -> Map Text Value -> a
> >
> > (promoting of `a` anywhere in the existing code needs big
> > refactoring, so map's value is `::Value` but not `::a`). Cons is a
> > need to implement N instances of `GetValue`: one per getting type.
> >
> > Anywhere, Jan, thanks for quick answer, I'm sorry for this stupid
> > question.
> >
> >  
> > > Hi,
> > >
> > > You don't know anything about your a's but that they have FromJSON
> > > instances. That in turn means you can get values from aeson
> > > parsing functions. Think parseJSON :: Value -> Parser a
> > > Could you be more specific about the problem you try to solve?
> > >
> > > Best
> > > Jan
> > >
> > > Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 10:32:
> > >  
> > > > Hello, List!
> > > >
> > > > I have, for example, function with signature like
> > > >
> > > >   fn :: FromJSON a => Map Text a -> BlahBlah
> > > >
> > > > and I want to treat this `a` as String (or `Text`), to read it
> > > > with `readMaybe`. Am I right that it's impossible? I get error
> > > > about "...a is rigid type and could not be matched with
> > > > Text...". But `Text` is `FromJSON` instance. Is it possible to
> > > > do it (cast, convert, unwrap, etc)?
> > > >
> > > > The problem's source is that early I worked with `Text` values
> > > > only (getting from HTML form) but now they become any type:
> > > > int's, bool's, etc).
> > > >
> > > > ===
> > > > Best regards,
> > > >   Paul
> > > > _______________________________________________
> > > > Beginners mailing list
> > > > [hidden email]
> > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > >  
> >
> > _______________________________________________
> > Beginners mailing list
> > [hidden email]
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >  

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to "cast" FromJSON instance value

Jan von Löwenstein

Hi,

getValue :: (FromJSON a) => Text -> Map Text a -> Maybe a
getValue key map = (fromResult.fromJSON) $ lookup key map

fromResult (Success a) = Just a
fromResult (Error _) = Nothing

I am not at a computer so I wouldn't be surprised if this doesn't compile. But you should see the picture.

Best
Jan


Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 13:48:
Ohh, pardon! Yes, signature was

  class GetValue a where
    getValue :: Text -> Map Text Value -> Maybe a

with `Maybe` sure. But I didn't understand you: what do you mean "to
use aeson directly"? Problem is to save `FromJSON a` instances in map
but get from the map `Text`, `Bool` and etc values. Sure, it possible
to parameterize all related functions/types with `FromJSON a => .. a`
but in this case I hit 2 problems:

1. rigid type error when I have `FromJSON a =>` in some signature and
   try to use this `a` as `Text` value, for example
2. big refactoring (many signatures, types)

So, I decided to save in the map `Value`s instead of `FromJSON a`s.
De-facto, this map is heterogenous and keeps values of different types.
And question for me was: to hide this fact under `FromJSON` or under
`Value`. I'm not sure what is the best solution and I don't know how to
solve 1.


> You'd still have to handle the case that the Value is not what you
> expected. Otherwise you'll have a partial function (i.e. error in
> case of certain inputs).
>
> So maybe you'd best use aeson directly (which spares you the GetValue
> instances as well).
>
> getValue :: (FromJSON a) => Text -> Map Text a -> Maybe a
>
> Best
> Jan
> P.S. There is no such thing as a stupid question.
>
> Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 13:02:
>
> > Hello, Jan! I "remove" the question :)
> > Problem was: reading of HTML form values, which can be any type and
> > saving them in a map. I done it w/ `Map Text Value` (instead of
> > previous `Map Text Text`). To get values from the map, I
> > implemented class and several instances which returns values of
> > different types, something like:
> >
> >   class GetValue a where
> >     getValue :: Text -> Map Text Value -> a
> >
> > (promoting of `a` anywhere in the existing code needs big
> > refactoring, so map's value is `::Value` but not `::a`). Cons is a
> > need to implement N instances of `GetValue`: one per getting type.
> >
> > Anywhere, Jan, thanks for quick answer, I'm sorry for this stupid
> > question.
> >
> >
> > > Hi,
> > >
> > > You don't know anything about your a's but that they have FromJSON
> > > instances. That in turn means you can get values from aeson
> > > parsing functions. Think parseJSON :: Value -> Parser a
> > > Could you be more specific about the problem you try to solve?
> > >
> > > Best
> > > Jan
> > >
> > > Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 10:32:
> > >
> > > > Hello, List!
> > > >
> > > > I have, for example, function with signature like
> > > >
> > > >   fn :: FromJSON a => Map Text a -> BlahBlah
> > > >
> > > > and I want to treat this `a` as String (or `Text`), to read it
> > > > with `readMaybe`. Am I right that it's impossible? I get error
> > > > about "...a is rigid type and could not be matched with
> > > > Text...". But `Text` is `FromJSON` instance. Is it possible to
> > > > do it (cast, convert, unwrap, etc)?
> > > >
> > > > The problem's source is that early I worked with `Text` values
> > > > only (getting from HTML form) but now they become any type:
> > > > int's, bool's, etc).
> > > >
> > > > ===
> > > > Best regards,
> > > >   Paul
> > > > _______________________________________________
> > > > Beginners mailing list
> > > > [hidden email]
> > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > >
> >
> > _______________________________________________
> > Beginners mailing list
> > [hidden email]
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Baa
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to "cast" FromJSON instance value

Baa
Jan, this is the exactly what I'm looked for! Thank you again! :)

  getValue :: FromJSON a => T.Text -> M.Map T.Text a -> Maybe a
  getValue k m = do
    j <- fromJSON <$> M.lookup k m
    case j of Success a -> return a
              _         -> Nothing


> Hi,
>
> getValue :: (FromJSON a) => Text -> Map Text a -> Maybe a
> getValue key map = (fromResult.fromJSON) $ lookup key map
>
> fromResult (Success a) = Just a
> fromResult (Error _) = Nothing
>
> I am not at a computer so I wouldn't be surprised if this doesn't
> compile. But you should see the picture.
>
> Best
> Jan
>
> Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 13:48:
>
> > Ohh, pardon! Yes, signature was
> >
> >   class GetValue a where
> >     getValue :: Text -> Map Text Value -> Maybe a
> >
> > with `Maybe` sure. But I didn't understand you: what do you mean "to
> > use aeson directly"? Problem is to save `FromJSON a` instances in
> > map but get from the map `Text`, `Bool` and etc values. Sure, it
> > possible to parameterize all related functions/types with `FromJSON
> > a => .. a` but in this case I hit 2 problems:
> >
> > 1. rigid type error when I have `FromJSON a =>` in some signature
> > and try to use this `a` as `Text` value, for example
> > 2. big refactoring (many signatures, types)
> >
> > So, I decided to save in the map `Value`s instead of `FromJSON a`s.
> > De-facto, this map is heterogenous and keeps values of different
> > types. And question for me was: to hide this fact under `FromJSON`
> > or under `Value`. I'm not sure what is the best solution and I
> > don't know how to solve 1.
> >
> >  
> > > You'd still have to handle the case that the Value is not what you
> > > expected. Otherwise you'll have a partial function (i.e. error in
> > > case of certain inputs).
> > >
> > > So maybe you'd best use aeson directly (which spares you the
> > > GetValue instances as well).
> > >
> > > getValue :: (FromJSON a) => Text -> Map Text a -> Maybe a
> > >
> > > Best
> > > Jan
> > > P.S. There is no such thing as a stupid question.
> > >
> > > Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 13:02:
> > >  
> > > > Hello, Jan! I "remove" the question :)
> > > > Problem was: reading of HTML form values, which can be any type
> > > > and saving them in a map. I done it w/ `Map Text Value`
> > > > (instead of previous `Map Text Text`). To get values from the
> > > > map, I implemented class and several instances which returns
> > > > values of different types, something like:
> > > >
> > > >   class GetValue a where
> > > >     getValue :: Text -> Map Text Value -> a
> > > >
> > > > (promoting of `a` anywhere in the existing code needs big
> > > > refactoring, so map's value is `::Value` but not `::a`). Cons
> > > > is a need to implement N instances of `GetValue`: one per
> > > > getting type.
> > > >
> > > > Anywhere, Jan, thanks for quick answer, I'm sorry for this
> > > > stupid question.
> > > >
> > > >  
> > > > > Hi,
> > > > >
> > > > > You don't know anything about your a's but that they have
> > > > > FromJSON instances. That in turn means you can get values
> > > > > from aeson parsing functions. Think parseJSON :: Value ->
> > > > > Parser a Could you be more specific about the problem you try
> > > > > to solve?
> > > > >
> > > > > Best
> > > > > Jan
> > > > >
> > > > > Baa <[hidden email]> schrieb am Di., 1. Aug. 2017, 10:32:
> > > > >  
> > > > > > Hello, List!
> > > > > >
> > > > > > I have, for example, function with signature like
> > > > > >
> > > > > >   fn :: FromJSON a => Map Text a -> BlahBlah
> > > > > >
> > > > > > and I want to treat this `a` as String (or `Text`), to read
> > > > > > it with `readMaybe`. Am I right that it's impossible? I get
> > > > > > error about "...a is rigid type and could not be matched
> > > > > > with Text...". But `Text` is `FromJSON` instance. Is it
> > > > > > possible to do it (cast, convert, unwrap, etc)?
> > > > > >
> > > > > > The problem's source is that early I worked with `Text`
> > > > > > values only (getting from HTML form) but now they become
> > > > > > any type: int's, bool's, etc).
> > > > > >
> > > > > > ===
> > > > > > Best regards,
> > > > > >   Paul
> > > > > > _______________________________________________
> > > > > > Beginners mailing list
> > > > > > [hidden email]
> > > > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > > > >  
> > > >
> > > > _______________________________________________
> > > > Beginners mailing list
> > > > [hidden email]
> > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > >  
> >
> > _______________________________________________
> > Beginners mailing list
> > [hidden email]
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >  

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Loading...