[Haskell-beginners] Question: Data Type for user selection

Hartmut hartmut0407 at googlemail.com
Sat Aug 20 15:22:04 CEST 2011


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 <hartmut0407 at googlemail.com>wrote:

> 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 <byorgey at seas.upenn.edu>wrote:
>
>> On Tue, Aug 16, 2011 at 04:44:15PM +0200, Ertugrul Soeylemez wrote:
>> > Brent Yorgey <byorgey at seas.upenn.edu> 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 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/20110820/95761bd2/attachment.htm>


More information about the Beginners mailing list