<div dir="ltr">Thank you, David. It is a good seed, I'll read more about it, I used already GADTs and type families but I don't understand them so deep.<div>By the way, yes, I got warning about tick and when I added it (s/Rainy/'Rainy/) it fixed warning :)</div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-09-01 19:19 GMT+03:00 David McBride <span dir="ltr"><<a href="mailto:toad3k@gmail.com" target="_blank">toad3k@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The terminology for what you are looking for was phantom type.  That<br>
is any type that looks like this, where the a is not mentioned on the<br>
right hand side.<br>
<br>
data Foo a = Foo<br>
<br>
What happens with datakinds is when you write<br>
<br>
data SomeType = Foo | Bar<br>
<br>
By default there is a type SomeType and two values Foo and Bar, which<br>
are of kind *, which is the default.  With datakinds enabled, it<br>
creates two new types 'Foo, and 'Bar, which have a kind SomeType<br>
(instead of *).  You can replace Rainy with 'Rainy in the other code I<br>
gave.  It compiles either way because there is no other type Rainy, so<br>
it assumes you must have meant 'Rainy.<br>
<br>
As for type families, what you have there are called open type<br>
families.  There is also a closed type families variant that prevents<br>
more instances of the type family from being declared by the library<br>
user.  It would look like this:<br>
<br>
data Sunny<br>
data Rainy<br>
<br>
type family Night a where<br>
  Night Sunny = SunnyNight<br>
  Night Rainy = RainyNight<br>
<br>
You could still write the following, which would not work in<br>
datakinds, but at least there is no constructor that you could use<br>
that would satisfy it other than the ones listed in the type family.<br>
<br>
impossibleDay2 :: Day ()<br>
impossibleDay2 = undefined<br>
<br>
There may be more to this than I know, but I think that about covers it.<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, Sep 1, 2017 at 11:23 AM, Baa <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>> wrote:<br>
> I pereputal emails.<br>
> ---<br>
><br>
> David, hello!<br>
><br>
> 1. Is it the same/different as:<br>
><br>
>   data family Day a<br>
>   data Sunny<br>
>   data Rainy<br>
>   data instance Day Sunny = SunnyDay deriving Show<br>
>   data instance Day Rainy = RainyDay deriving Show<br>
><br>
>   ..and here you can not create `Day Int` object because no `Day Int`<br>
>   constructor (but you can create such constructor)<br>
><br>
> ? Or in case with type families there is possibility to extend it to<br>
> `Day Int` and in case with DayaKinds it's totally impossible?<br>
><br>
> 2. I read somewhere (on forums) that restrictions on data types... I<br>
> don't remember exactly, but something like they are not real<br>
> restrictions or are related to old extension which is/will be<br>
> deprecated. I'm not sure. Also, I'm not sure is it - in your example -<br>
> restriction (constraint) or something else. Am I wrong?<br>
><br>
>> This is maybe edging toward haskell-cafe territory, but you can<br>
>> definitely do this in haskell.<br>
>><br>
>> {-# LANGUAGE DataKinds, KindSignatures #-}<br>
>><br>
>> data DayType = Sunny | Rainy<br>
>><br>
>> data Day (a :: DayType) = Day<br>
>><br>
>><br>
>> sunnyDay :: Day Sunny<br>
>> sunnyDay = Day<br>
>><br>
>> rainyDay :: Day Rainy<br>
>> rainyDay = Day<br>
>><br>
>> -- impossibleDay :: Day ()<br>
>> -- impossibleDay = Day<br>
>><br>
>> On Fri, Sep 1, 2017 at 10:18 AM, Baa <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>> wrote:<br>
>> > Hello, List!<br>
>> ><br>
>> > For example, I have specialized (right nameis phantom?) type:<br>
>> ><br>
>> >   data Day a = Day { ... no `a` here }<br>
>> >   data Sunny<br>
>> >   data Rainy<br>
>> ><br>
>> >   joyToday :: Day Sunny -> IO ()<br>
>> >   joyToday day = ...<br>
>> ><br>
>> >   melancholyToday :: Day Rainy -> IO ()<br>
>> >   melancholyToday day = ...<br>
>> ><br>
>> > And I can create (in spite of that it's phantom) some day:<br>
>> ><br>
>> >   let day1 = Day {...} :: Day Sunny<br>
>> >   joyToday day1<br>
>> ><br>
>> > but no problem to create `Day Int`, `Day Char`, etc which is<br>
>> > pointless actually (sure "creator"-function can be exported from the<br>
>> > module only, but I'm talking about type-level solution).<br>
>> ><br>
>> > I know that constraints (`... =>`) on data types are<br>
>> > redundant/removed from the language. And I'm not sure how it's<br>
>> > possible to restrict that parameter `a` (I know that it's possible<br>
>> > to Java/C++/Perl6 (not sure), some other languages but how to add<br>
>> > such restriction in Haskell? IMHO type families can help but I'm<br>
>> > not sure how it will look (Sunny, Rainy are "nullary" type, so...).<br>
>> ><br>
>> > Is it possible for Haskell too?<br>
>> ><br>
>> > ===<br>
>> > Best regards, Paul<br>
>> > ______________________________<wbr>_________________<br>
>> > Beginners mailing list<br>
>> > <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
>> > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
>> ______________________________<wbr>_________________<br>
>> Beginners mailing list<br>
>> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
><br>
> ______________________________<wbr>_________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br></div>