<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Dear Haskell experts,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I working  on a large Haskell project on Model Based Testing (see https://github.com/TorXakis/TorXakis)
<o:p></o:p></p>
<p class="MsoNormal">and I would like to get feedback on a design issue I have related to extension and parameterized classes.<o:p></o:p></p>
<p class="MsoNormal">I will describe a small simplified example to illustrate the issue<o:p></o:p></p>
<p class="MsoNormal">and I appreciate any feedback.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have a class that extends another class as follows:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">class Base a => Extend a where<o:p></o:p></p>
<p class="MsoNormal">    -- | Constructor from Base<o:p></o:p></p>
<p class="MsoNormal">    fromBase :: Base b => b -> a<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I can define an instance of Extend that hides the Base implementation as follows:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">{-# LANGUAGE ExistentialQuantification #-}<o:p></o:p></p>
<p class="MsoNormal">data BaseHidden = forall a . Base a => <o:p></o:p></p>
<p class="MsoNormal">                            BaseHidden { _base :: a<o:p></o:p></p>
<p class="MsoNormal">                                       , ... -- additional extension info<o:p></o:p></p>
<p class="MsoNormal">                                       }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">instance Extend BaseHidden where<o:p></o:p></p>
<p class="MsoNormal">    fromBase b = BaseHidden b ... -- additional extension initialization<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I can define a parameterized data class of which the parameter is the type of the Base class as follows:<o:p></o:p></p>
<p class="MsoNormal">data BaseExpose a = BaseExpose { _base :: a<o:p></o:p></p>
<p class="MsoNormal">                               , ... -- additional extension info<o:p></o:p></p>
<p class="MsoNormal">                               }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">With this parameterized data class, I can make the following fromBase' function<o:p></o:p></p>
<p class="MsoNormal">fromBase' :: Base a => a -> BaseExpose a<o:p></o:p></p>
<p class="MsoNormal">fromBase' a = BaseExpose a ... -- additional extension initialization<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">My question is can I make BaseExpose an instance of Extend?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am aware that the signature of fromBase states that for all 'b' of Base<o:p></o:p></p>
<p class="MsoNormal">an Extend of type 'a' must be able to be made.<o:p></o:p></p>
<p class="MsoNormal">Yet, in my case 'a' is a parameterized class 'BaseExpose x' and
<o:p></o:p></p>
<p class="MsoNormal">since the type of Extend is provided (it is a constructor)<o:p></o:p></p>
<p class="MsoNormal">I think it is acceptable that 'BaseExpose b' is returned as type.<o:p></o:p></p>
<p class="MsoNormal">I have looked at some extensions, such as InstanceSigs, yet I found no solution.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Does anybody on this mailing list have an answer or solution for me?<o:p></o:p></p>
<p class="MsoNormal">Also experience in a large project related to maintenance for the two alternatives (hiding or exposing types) is appreciated!<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="NL">Thanks in advance,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NL">    Pierre van de Laar<o:p></o:p></span></p>
</div>
<br>
<hr>
<font face="Arial" color="Gray" size="1">The information contained in this message may be confidential and legally protected under applicable law. The message is intended solely for the addressee(s). If you are not the intended recipient, you are hereby notified
 that any use, forwarding, dissemination, or reproduction of this message is strictly prohibited and may be unlawful. If you are not the intended recipient, please contact the sender by return e-mail and destroy all copies of the original message.<br>
</font>
</body>
</html>