Convert my own types to the Haskell types using typeclass

Hi, I want to define a typeclass that can convert my own types like MyBool, MyInt, MyOption to according Haskell types -- Bool, Int, Maybe. Currently I can convert the first two types, but for MyOption, I don't how to do, since it is a polymophic type. Here is my toy program: -------------------------------------------------------------- {-# LANGUAGE TypeFamilies #-} module Coercible where import qualified Prelude data MyBool = MyTrue | MyFalse data MyInt = Zero | One | Two data MyOption a = Some a | None class Coercible a where type Return a :: * toHaskell :: a -> (Return a) instance Coercible MyBool where type Return MyBool = Prelude.Bool toHaskell MyTrue = Prelude.True toHaskell MyFalse = Prelude.False instance Coercible MyInt where type Return MyInt = Prelude.Int toHaskell Zero = 0 toHaskell One = 1 toHaskell Two = 2 instance Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe a toHaskell (Some a) = Prelude.Just a toHaskell None = Prelude.Nothing -------------------------------------------------------------------------- The problem occurs when I am trying to use "toHaskell (Some MyBool)", the error message is "Not in scope: data constructor `MyBool'". Any hints will be appreciated !! Best, --Ke

On Fri, Apr 11, 2014 at 9:50 AM, ke dou
Hi,
I want to define a typeclass that can convert my own types like MyBool, MyInt, MyOption to according Haskell types -- Bool, Int, Maybe.
Currently I can convert the first two types, but for MyOption, I don't how to do, since it is a polymophic type.
Here is my toy program: -------------------------------------------------------------- {-# LANGUAGE TypeFamilies #-}
module Coercible where
import qualified Prelude
data MyBool = MyTrue | MyFalse data MyInt = Zero | One | Two data MyOption a = Some a | None
class Coercible a where type Return a :: * toHaskell :: a -> (Return a)
instance Coercible MyBool where type Return MyBool = Prelude.Bool toHaskell MyTrue = Prelude.True toHaskell MyFalse = Prelude.False
instance Coercible MyInt where type Return MyInt = Prelude.Int toHaskell Zero = 0 toHaskell One = 1 toHaskell Two = 2
instance Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe a toHaskell (Some a) = Prelude.Just a toHaskell None = Prelude.Nothing -------------------------------------------------------------------------- The problem occurs when I am trying to use "toHaskell (Some MyBool)", the error message is "Not in scope: data constructor `MyBool'". Any hints will be appreciated !!
`Some MyBool` isn't valid Haskell. MyBool is the name of a type, there's no binding or constructor with that name. `toHaskell (Some MyTrue)` evaluates to `Just MyTrue` as expected.

Thank you, Bob.
I also noticed that, but don't know how to fix it.
Any suggestions?
--Ke
On Fri, Apr 11, 2014 at 1:05 PM, Bob Ippolito
On Fri, Apr 11, 2014 at 9:50 AM, ke dou
wrote: Hi,
I want to define a typeclass that can convert my own types like MyBool, MyInt, MyOption to according Haskell types -- Bool, Int, Maybe.
Currently I can convert the first two types, but for MyOption, I don't how to do, since it is a polymophic type.
Here is my toy program: -------------------------------------------------------------- {-# LANGUAGE TypeFamilies #-}
module Coercible where
import qualified Prelude
data MyBool = MyTrue | MyFalse data MyInt = Zero | One | Two data MyOption a = Some a | None
class Coercible a where type Return a :: * toHaskell :: a -> (Return a)
instance Coercible MyBool where type Return MyBool = Prelude.Bool toHaskell MyTrue = Prelude.True toHaskell MyFalse = Prelude.False
instance Coercible MyInt where type Return MyInt = Prelude.Int toHaskell Zero = 0 toHaskell One = 1 toHaskell Two = 2
instance Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe a toHaskell (Some a) = Prelude.Just a toHaskell None = Prelude.Nothing -------------------------------------------------------------------------- The problem occurs when I am trying to use "toHaskell (Some MyBool)", the error message is "Not in scope: data constructor `MyBool'". Any hints will be appreciated !!
`Some MyBool` isn't valid Haskell. MyBool is the name of a type, there's no binding or constructor with that name. `toHaskell (Some MyTrue)` evaluates to `Just MyTrue` as expected.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

There is nothing to fix. It is doing exactly as you intended. You are
confusing types vs values. Integer is a type, 1, 2, and 3 are values.
toHaskell takes a type (MyOption a) and converts it to a type (Maybe a).
But in your actual code you will use values ie. toHaskell (Some 'a' ::
MyOption Char) and get back a (Just 'a' :: Maybe Char).
On Fri, Apr 11, 2014 at 1:13 PM, ke dou
Thank you, Bob. I also noticed that, but don't know how to fix it. Any suggestions?
--Ke
On Fri, Apr 11, 2014 at 1:05 PM, Bob Ippolito
wrote: On Fri, Apr 11, 2014 at 9:50 AM, ke dou
wrote: Hi,
I want to define a typeclass that can convert my own types like MyBool, MyInt, MyOption to according Haskell types -- Bool, Int, Maybe.
Currently I can convert the first two types, but for MyOption, I don't how to do, since it is a polymophic type.
Here is my toy program: -------------------------------------------------------------- {-# LANGUAGE TypeFamilies #-}
module Coercible where
import qualified Prelude
data MyBool = MyTrue | MyFalse data MyInt = Zero | One | Two data MyOption a = Some a | None
class Coercible a where type Return a :: * toHaskell :: a -> (Return a)
instance Coercible MyBool where type Return MyBool = Prelude.Bool toHaskell MyTrue = Prelude.True toHaskell MyFalse = Prelude.False
instance Coercible MyInt where type Return MyInt = Prelude.Int toHaskell Zero = 0 toHaskell One = 1 toHaskell Two = 2
instance Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe a toHaskell (Some a) = Prelude.Just a toHaskell None = Prelude.Nothing
-------------------------------------------------------------------------- The problem occurs when I am trying to use "toHaskell (Some MyBool)", the error message is "Not in scope: data constructor `MyBool'". Any hints will be appreciated !!
`Some MyBool` isn't valid Haskell. MyBool is the name of a type, there's no binding or constructor with that name. `toHaskell (Some MyTrue)` evaluates to `Just MyTrue` as expected.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On Fri, Apr 11, 2014 at 12:50:45PM -0400, ke dou wrote:
instance Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe a toHaskell (Some a) = Prelude.Just a toHaskell None = Prelude.Nothing
The basic issue has been solved in another thread, but wouldn't you want this one to be something like this: instance Coercible a => Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe (Return a) toHaskell (Some a) = Prelude.Just (toHaskell a) toHaskell None = Prelude.Nothing /M -- Magnus Therning OpenPGP: 0xAB4DFBA4 email: magnus@therning.org jabber: magnus@therning.org twitter: magthe http://therning.org/magnus What gets measured, gets done. -- Tom Peters

Thank you very much!
That is exactly what I want.
Best,
Ke
On Fri, Apr 11, 2014 at 2:43 PM, Magnus Therning
On Fri, Apr 11, 2014 at 12:50:45PM -0400, ke dou wrote:
instance Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe a toHaskell (Some a) = Prelude.Just a toHaskell None = Prelude.Nothing
The basic issue has been solved in another thread, but wouldn't you want this one to be something like this:
instance Coercible a => Coercible (MyOption a) where type Return (MyOption a) = Prelude.Maybe (Return a) toHaskell (Some a) = Prelude.Just (toHaskell a) toHaskell None = Prelude.Nothing
/M
-- Magnus Therning OpenPGP: 0xAB4DFBA4 email: magnus@therning.org jabber: magnus@therning.org twitter: magthe http://therning.org/magnus
What gets measured, gets done. -- Tom Peters
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
participants (4)
-
Bob Ippolito
-
David McBride
-
ke dou
-
Magnus Therning