<div dir="auto"><div>Using Void states that the list will always be empty, because the only way to put elements in it would be to fill in the Void fields with bottoms. () is the canonical choice for "doesn't matter", but a custom</div><div dir="auto"><br></div><div dir="auto">data Boring = DoNotBother</div><div dir="auto"><br></div><div dir="auto">would work as well.<br><div class="gmail_extra" dir="auto"><br><div class="gmail_quote">On Mar 24, 2017 5:26 PM, "Bardur Arantsson" <<a href="mailto:spam@scientician.net">spam@scientician.net</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
[Context: I'm working on a CQRS/ES library and in the following, "i" is<br>
an identifier for an aggregate root, "e" is an event type, and the "Int"<br>
is a sequence number.]<br>
<br>
So, I have a data type<br>
<br>
    data Foo i e = Foo i e Int<br>
<br>
where I want to have a corresponding<br>
<br>
    data Batch i e = Batch i [Foo x e Int]<br>
<br>
    (I'll come back to "x". It's just a metasyntactic variable for now.<br>
    The point of the "Int" is that it's extra information that I really<br>
    need to keep, but it's not essential to the Foo data structure<br>
    itself.)<br>
<br>
with an operation<br>
<br>
    batchFoos :: [Foo i e] -> [Batch i e]<br>
    batchFoos = ...<br>
      (basically a standard Data.List.groupBy<br>
      where I compare for equality on the i's.)<br>
<br>
I also have an extraction function<br>
<br>
    toList :: Batch i e -> (i, [Foo x e Int])<br>
<br>
My question is then: What's the best thing to use for "x", Void or ()?<br>
The idea behind "collapsing" the "i" parameter away to an "x" is to<br>
signal to users to the API that they can be absolutely certain that when<br>
they call "toList", they can be sure that all the Foo's that they get<br>
back have the same i value, namely the one which is the first component<br>
of the tuple.<br>
<br>
An alernative I've been considering is actually to create a Foo' type<br>
which actually does eliminate the i parameter, but it seems a bit<br>
boilerplatey. (It's not a *lot* of code to duplicate, so if it looks<br>
like the best option, I'll do that... but it feels odd.)<br>
<br>
Anyone have any suggestions on what the best way to approach this would be?<br>
<br>
(Aside: AFAICT there's no reasonable way to implement anything like<br>
Foldable or Traversable to avoid the explicit "toList" function, right?<br>
AFAICT Foldable/Traversable constrain you to using the *actual* last<br>
type parameter, "e", for folding over. Are there any generic alternative<br>
type classes that let you "pick your own element type"? I'm guessing<br>
Traversal could possibly be that, but if I have to incur a Lens<br>
dependency, I'll just live with a "toList" function. This is just about<br>
whether it can be done elegantly -- it's not a big deal.)<br>
<br>
Regards,<br>
<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div><br></div></div></div>