[Haskell] [Haskell-beginners] Restrict type in phantom data-type

David Feuer david.feuer at gmail.com
Fri Sep 1 15:08:42 UTC 2017


This is off-topic for this list. This list is for announcements. This
belongs on haskell-cafe at haskell.org

On Sep 1, 2017 11:05 AM, "Baa" <aquagnu at gmail.com> wrote:

> David, hello!
>
> 1. Is it the same/different as:
>
>   data family Day a
>   data Sunny
>   data Rainy
>   data instance Day Sunny = SunnyDay deriving Show
>   data instance Day Rainy = RainyDay deriving Show
>
>   ..and here you can not create `Day Int` object because no `Day Int`
>   constructor (but you can create such constructor)
>
> ? Or in case with type families there is possibility to extend it to
> `Day Int` and in case with DayaKinds it's totally impossible?
>
> 2. I read somewhere (on forums) that restrictions on data types... I
> don't remember exactly, but something like they are not real
> restrictions or are related to old extension which is/will be
> deprecated. I'm not sure. Also, I'm not sure is it - in your example -
> restriction (constraint) or something else. Am I wrong?
>
> > This is maybe edging toward haskell-cafe territory, but you can
> > definitely do this in haskell.
> >
> > {-# LANGUAGE DataKinds, KindSignatures #-}
> >
> > data DayType = Sunny | Rainy
> >
> > data Day (a :: DayType) = Day
> >
> >
> > sunnyDay :: Day Sunny
> > sunnyDay = Day
> >
> > rainyDay :: Day Rainy
> > rainyDay = Day
> >
> > -- impossibleDay :: Day ()
> > -- impossibleDay = Day
> >
> > On Fri, Sep 1, 2017 at 10:18 AM, Baa <aquagnu at gmail.com> wrote:
> > > Hello, List!
> > >
> > > For example, I have specialized (right nameis phantom?) type:
> > >
> > >   data Day a = Day { ... no `a` here }
> > >   data Sunny
> > >   data Rainy
> > >
> > >   joyToday :: Day Sunny -> IO ()
> > >   joyToday day = ...
> > >
> > >   melancholyToday :: Day Rainy -> IO ()
> > >   melancholyToday day = ...
> > >
> > > And I can create (in spite of that it's phantom) some day:
> > >
> > >   let day1 = Day {...} :: Day Sunny
> > >   joyToday day1
> > >
> > > but no problem to create `Day Int`, `Day Char`, etc which is
> > > pointless actually (sure "creator"-function can be exported from the
> > > module only, but I'm talking about type-level solution).
> > >
> > > I know that constraints (`... =>`) on data types are
> > > redundant/removed from the language. And I'm not sure how it's
> > > possible to restrict that parameter `a` (I know that it's possible
> > > to Java/C++/Perl6 (not sure), some other languages but how to add
> > > such restriction in Haskell? IMHO type families can help but I'm
> > > not sure how it will look (Sunny, Rainy are "nullary" type, so...).
> > >
> > > Is it possible for Haskell too?
> > >
> > > ===
> > > Best regards, Paul
> > > _______________________________________________
> > > Beginners mailing list
> > > Beginners at haskell.org
> > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
> _______________________________________________
> Haskell mailing list
> Haskell at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell/attachments/20170901/142f9471/attachment.html>


More information about the Haskell mailing list