Hi Tim,<br><br><div class="gmail_quote">On Thu, Aug 4, 2011 at 08:57, Tim Cowlishaw <span dir="ltr">&lt;<a href="mailto:tim@timcowlishaw.co.uk">tim@timcowlishaw.co.uk</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hi all,<br>
<br>
I&#39;ve been writing a DSL to describe securities orders, and after a lot<br>
of help from the kind folk of this list and #haskell have come up with<br>
the following implementation, using generalised algebraic data types:<br>
<br>
<a href="https://gist.github.com/1124621" target="_blank">https://gist.github.com/1124621</a><br>
<br>
Elsewhere in my application, I make use of the order type defined<br>
therein in the following newtype declaration:<br>
<br>
 newtype OrderListLevel s = OrderListLevel {orders :: [Order s Limit]}<br>
deriving (Eq, Show)<br>
<br>
However, the &#39;deriving&#39; clause here fails:<br>
<br>
src/Simulation/OrderList.hs:9:82:<br>
    No instance for (Eq (Order s Limit))<br>
      arising from the &#39;deriving&#39; clause of a data type declaration<br>
                   at src/Simulation/OrderList.hs:9:82-83<br>
<br>
src/Simulation/OrderList.hs:9:86:<br>
    No instance for (Show (Order s Limit))<br>
      arising from the &#39;deriving&#39; clause of a data type declaration<br>
                   at src/Simulation/OrderList.hs:9:86-89<br>
<br>
<br>
<br>
I don&#39;t fully understand this - the error is correct that there is no<br>
instance of either Eq or Show for (Order s Limit), however, instances<br>
are defined for Order Buy Limit and Order Sell Limit, and since these<br>
are the only possible types that a value can be constructed with (the<br>
type constructor is &#39;closed&#39; over these types in some sense I guess),<br>
it seems to me that this should provide enough information to derive<br>
the Eq and Show instances. Am I making unreasonable expectations of<br>
ghci&#39;s instance-deriving mechanism here, or missing something obvious?<br></blockquote><div><br>Here you seem to be using newtype deriving in particular, which behaves differently from standard deriving. Compiling with -ddump-deriv will show you the instances GHC is generating, which can help in debugging.<br>

<br>Note however that deriving instances for GADTs is not trivial, in general. In particular, you should not assume that GHC knows that `s` can only be instantiated with `Buy` and `Sell` since (because we lack a proper kind system) nothing prevents you from later using, say, `Order Int Limit` somewhere.<br>

<br>I describe the issue in more detail in the paper:<br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">José Pedro Magalhães and Johan Jeuring.
    <span class="bold">Generic Programming for Indexed Datatypes</span>.<br>Color pdf: <a href="http://dreixel.net/research/pdf/gpid.pdf">http://dreixel.net/research/pdf/gpid.pdf</a><br>Greyscale pdf: <a href="http://dreixel.net/research/pdf/gpid_nocolor.pdf">http://dreixel.net/research/pdf/gpid_nocolor.pdf</a><br>

</blockquote><br><br>Cheers,<br>Pedro<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
Many thanks in advance,<br>
<br>
Tim<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>