[Haskell-beginners] Convert my own types to the Haskell types using typeclass

David McBride toad3k at gmail.com
Fri Apr 11 17:22:29 UTC 2014


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 <kd6ck at virginia.edu> wrote:

> 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 <bob at redivi.com> wrote:
>
>> On Fri, Apr 11, 2014 at 9:50 AM, ke dou <kd6ck at virginia.edu> 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 at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140411/f37876fd/attachment.html>


More information about the Beginners mailing list