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@redivi.com> wrote:
On Fri, Apr 11, 2014 at 9:50 AM, ke dou <kd6ck@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@haskell.org
http://www.haskell.org/mailman/listinfo/beginners