
Now I have found a solution and everything is fine :-)
Thanks again for your help!
-- 3. MultiSelect -----------------------------------------
data MultiSelect a = EmptySel | SingleSel (ExtendedSelect a) | MultiSel
[(ExtendedSelect a)]
a1 = EmptySel
a2 = SingleSel x1i
a3 = MultiSel [x1i, x1e]
On Sat, Aug 20, 2011 at 12:03 AM, Hartmut
All, thank You All for your gentle help. Now I am a step further :-) But there raises up the next question: In the last line, I want the datatype MultiSelect being limited to a's which are of type "ExtendedSelect x". How can I add this contraint? Hartmut
{-# LANGUAGE GADTs #-}
module SelectionCriterias2 where
data InclusiveOrExclusive = Inclusive | Exclusive
-- 1. BasicSelect ------------------------------------------ data BasicSelect a where NumSelect :: Num a => a->BasicSelect a ShowSelect :: Show a => a->BasicSelect a
-- examples: x1 = NumSelect 10 x2 = ShowSelect "Hello" x3 = NumSelect 120.1
-- 2. ExtendedSelect ---------------------------------------
data ExtendedSelect a = ExtendedSelect { basicSel :: BasicSelect a, inclOrExcl :: InclusiveOrExclusive }
-- examples: x1i :: ExtendedSelect Integer x1i = ExtendedSelect { basicSel = x1, inclOrExcl = Inclusive } x1e = ExtendedSelect { basicSel = x1, inclOrExcl = Exclusive } x2i = ExtendedSelect { basicSel = x2, inclOrExcl = Inclusive } x2e = ExtendedSelect { basicSel = x2, inclOrExcl = Exclusive }
-- Abbreviation/helper for the construction: extsel :: BasicSelect a -> InclusiveOrExclusive -> ExtendedSelect a extsel s ie = ExtendedSelect { basicSel = s, inclOrExcl = ie }
-- examples: x3i = extsel x3 Inclusive x3e = extsel x3 Exclusive
-- 3. MultiSelect ----------------------------------------- data MultiSelect a = EmptySel | SingleSel a | MultiSel [a]
On Wed, Aug 17, 2011 at 3:42 PM, Brent Yorgey
wrote: On Tue, Aug 16, 2011 at 04:44:15PM +0200, Ertugrul Soeylemez wrote:
Brent Yorgey
wrote: That's a bit of a contradiction, because you are using existentials yourself in your GADT.
No, he isn't.
data BasicSelect a where SelectionNum :: Num a => a -> BasicSelect a SelectionStr :: Show a => a -> BasicSelect a
'a' shows up in the result type of both constructors, so there is no existential quantification going on here.
Oh, right. How would one express this as an ADT? Seems impossible to me.
You cannot, with just Haskell 2010. Strangely, if you try this:
data BasicSelect a = Num a => SelectionNum a | Show a => SelectionStr a
you get this error (ghc 7.0.3):
Data constructor `SelectionNum' has existential type variables, or a context (Use -XExistentialQuantification or -XGADTs to allow this) In the definition of data constructor `SelectionNum' In the data type declaration for `BasicSelect'
And enabling ExistentialQuantification makes the error go away! So apparently the ExistentialQuantification flag also enables type class constraints on data constructors, even when no existential quantification is involved. Odd.
-Brent
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners