<div dir="ltr">Hello,<br><br>Given a type T, this type identifies a set of values and this set can be deduced from the structure of type T.<br><br>i.e the type String&nbsp; is the set of all possible lists of character whatever their length.<br>
<br>This being said, I have the following question:<br><br>Given a type T, how is it possible to further restrict its set of values? i.e, in the above case, how is it possible to define a type String2 whose elements are any list of characters&nbsp; whose length is &lt;= 5.<br>
<br>I believe the best way to deal with that is to make String2 an&nbsp; ADT. This allows the constraint (in this case, the length) to be checked but hides the structure of the type, thus limits the use of pattern matching (in this case I do not want to hide the implementation of the type, so the ADT is not used that way).<br>
<br>If one wants to use pattern matching, then the module must provide a way to convert from String2 to a type whose constructors are visible (asString in this exemple)<br><br><div style="margin-left: 40px; font-family: courier new,monospace;">
module A <br>(<br>String2<br>,mkString2<br>,asString<br>)<br>where<br><br>import List <br><br>data String2 =&nbsp; String2 String<br><br><br>mkString2 l = if (length l) &lt;= 5 then String2 l<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else error &quot;length &gt; 5&quot;<br>
<br>asString (String2 l) = l<br></div><br>Btw, F# has found a nice solution to this problem, it allows the user to define an &quot;active pattern&quot;, that is, a pattern to applies on ADT:<br><br><div style="margin-left: 40px;">
&nbsp; <a href="http://blogs.msdn.com/dsyme/archive/2007/04/07/draft-paper-on-f-active-patterns.aspx">http://blogs.msdn.com/dsyme/archive/2007/04/07/draft-paper-on-f-active-patterns.aspx</a><br></div><br>Is there another way to address that problem in Haskell?<br>
<br>Thank you<br><br>Regards<br><br>J-C Mincke<br></div>