I found an acceptable, but not too nice workaround:

* Add another class without methods:

    class HasX a => HasX' a

* Make all types that may be unconstrained an instance of this class:

    instance HasX' Number

* Make pairs an instance of HasX (this feels wrong):

    instance HasX (a1,a2) where
      xVal = undefined

* Add appropriate constraints to the GADT types (X has constraint HasX'):

    data Val a where
      P :: a -> Val a        -- Primitive

      T2 :: (HasX a1, HasX a2) => (Val a1, Val a2) -> Val (a1,a2)

      X :: HasX' a => Val a  -- Unconstrained

* Add (HasX a => ) to the value type.


At least this is safe. The undefined xVal will never be run.

I still wonder if the original idea couldn't work somehow...

Thank you,

/ Emil



Emil Axelsson skrev:
Hello all,

Could I please get some guidance with this?

I'm working on implementing a simple relational language in Haskell.
I'm trying to construct a data type that can represent values and patterns for a small set of supported types. See code below.

HasX is a class of types that have an unconstrained value (xVal).

Number is a typical member of that class.

Val is my value/pattern data type.
P represents a primitive value and T2 is used to make structure.
X represents the unconstrained value or a wildcard pattern. It can only be used for types in HasX.

The problem is the commented line in the value function. I want to use the xVal method to get the value for X. This is only allowed if I add the constraint (HasX a => ). But I don't want value to have that constraint, since then I cannot run it on pairs. Furthermore, it should be safe without the constraint. ex2 shows that we cannot use X to construct values that are not in HasX.

Is this just a limitation of the current GATDs, or is it unreasonable of me to expect this to work?

Is there any workaround, such as coercing the type of the value function?

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

Reply via email to