<div dir="ltr">I like withDict a lot. It is direct, easy to chain/use, avoids fighting about direction completely, and even matches the argument order used by reify in the reflection library.<div><br></div><div>+1 from me.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 26, 2021 at 7:49 AM Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">|  I would like to propose one more option:<br>
|  <br>
|  withDict :: dt -> (ct => a) -> a<br>
<br>
Ah, you mean simply: swap the argument order.   I can see your logic about chaining etc.  I'd be fine with this.<br>
<br>
Simon<br>
<br>
|  -----Original Message-----<br>
|  From: Krzysztof Gogolewski <<a href="mailto:krz.gogolewski@gmail.com" target="_blank">krz.gogolewski@gmail.com</a>><br>
|  Sent: 26 April 2021 15:35<br>
|  To: Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>><br>
|  Cc: Spiwack, Arnaud <<a href="mailto:arnaud.spiwack@tweag.io" target="_blank">arnaud.spiwack@tweag.io</a>>; Edward Kmett<br>
|  <<a href="mailto:ekmett@gmail.com" target="_blank">ekmett@gmail.com</a>>; GHC developers <<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a>><br>
|  Subject: Re: magicDict<br>
|  <br>
|  I would like to propose one more option:<br>
|  <br>
|  withDict :: dt -> (ct => a) -> a<br>
|  <br>
|  1. This is less symmetric than '(ct => a) -> dt -> a'<br>
|     but in existing applications magicDict gets the arguments<br>
|     in the reverse order.<br>
|  2. Easier to chain 'withDict d1 (withDict d2 ...)'.<br>
|  3. The name is similar to 'withTypeable' or 'withFile',<br>
|     and avoids arguing which is reify or reflect.<br>
|  <br>
|  On Mon, Apr 26, 2021 at 9:41 AM Simon Peyton Jones via ghc-devs <ghc-<br>
|  <a href="mailto:devs@haskell.org" target="_blank">devs@haskell.org</a>> wrote:<br>
|  ><br>
|  > Can we just agree a name, then?   Please correct me if I'm wrong,<br>
|  but<br>
|  ><br>
|  > I think Ed prefers 'reifyDict',<br>
|  > That is compatible with the existing reflection library Arnaud<br>
|  > disagrees but isn't going to die in the trenches for this one<br>
|  > Virtually anything is better than 'magicDict'.<br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  > So: reifyDict it is?<br>
|  ><br>
|  ><br>
|  ><br>
|  > Simon<br>
|  ><br>
|  ><br>
|  ><br>
|  > From: Spiwack, Arnaud <<a href="mailto:arnaud.spiwack@tweag.io" target="_blank">arnaud.spiwack@tweag.io</a>><br>
|  > Sent: 26 April 2021 08:10<br>
|  > To: Edward Kmett <<a href="mailto:ekmett@gmail.com" target="_blank">ekmett@gmail.com</a>><br>
|  > Cc: Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>>; GHC developers<br>
|  > <<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a>><br>
|  > Subject: Re: magicDict<br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  > On Sun, Apr 25, 2021 at 2:20 AM Edward Kmett <<a href="mailto:ekmett@gmail.com" target="_blank">ekmett@gmail.com</a>><br>
|  wrote:<br>
|  ><br>
|  > I speak to much this same point in this old stack overflow response,<br>
|  though to exactly the opposite conclusion, and to exactly the opposite<br>
|  pet peeve.<br>
|  ><br>
|  ><br>
|  ><br>
|  ><br>
|  <a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstac" rel="noreferrer" target="_blank">https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstac</a><br>
|  ><br>
|  <a href="http://koverflow.com" rel="noreferrer" target="_blank">koverflow.com</a>%2Fa%2F5316014%2F34707&amp;data=04%7C01%7Csimonpj%40micro<br>
|  ><br>
|  <a href="http://soft.com" rel="noreferrer" target="_blank">soft.com</a>%7C87da21fdcc8e4ed6bef508d908c071fb%7C72f988bf86f141af91ab2d7c<br>
|  ><br>
|  d011db47%7C1%7C0%7C637550444930791696%7CUnknown%7CTWFpbGZsb3d8eyJWIjoi<br>
|  ><br>
|  MC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;<br>
|  ><br>
|  sdata=VlRrIEROGj%2BE6%2FuLXBEdfa%2BPWVlHh50dahgjIrw4tQU%3D&amp;reserve<br>
|  > d=0<br>
|  ><br>
|  ><br>
|  ><br>
|  > :-)<br>
|  ><br>
|  ><br>
|  ><br>
|  > I do not feel that I chose the vocabulary without due consideration<br>
|  of the precise meaning of the words used.<br>
|  ><br>
|  ><br>
|  ><br>
|  > I didn't mean to imply that you did. Sorry if I did so: written<br>
|  communication is hard. For what it's worth, I didn't really think that<br>
|  I would change your mind, either.<br>
|  ><br>
|  ><br>
|  ><br>
|  > Though it still seems to me that the name `ReifiedMonoid` uses the<br>
|  word for a different thing than the `reifyMonoid` function does.<br>
|  ><br>
|  ><br>
|  ><br>
|  > To be explicit:<br>
|  ><br>
|  ><br>
|  ><br>
|  > Viewing a type as a space, 'reify' in the reflection library takes<br>
|  some space 'a' and splits it into individual fibers for each term in<br>
|  'a', finding the appropriate one and handing it back to you as a fresh<br>
|  type 's' that captures just that singular value. The result is<br>
|  significantly less abstract, as we gained detail on the type, now<br>
|  every point in the original space 'a' is a new space. At the type<br>
|  level the fresh 's' in s `Reifies` a now concretely names exactly one<br>
|  inhabitant of 'a'.<br>
|  ><br>
|  ><br>
|  ><br>
|  > On the flip side, 'reflect' in the reflection library forgets this<br>
|  finer fibration / structure on space, losing the information about<br>
|  which fiber the answer came from, being forgetful is precisely the<br>
|  justification of it being the 'reflect' half of the reify -| reflect<br>
|  pairing.<br>
|  ><br>
|  ><br>
|  ><br>
|  > I confess I don't necessarily anticipate this changing your mind but<br>
|  it was not chosen blindly, reflect is the forgetful mapping here,<br>
|  reification is free and left adjoint to it, at least in the context of<br>
|  reflection-the-library, where a quantifier is being injected to track<br>
|  the particular member.<br>
|  ><br>
|  ><br>
|  ><br>
|  > I've got to admit that I have the hardest time seeing the `s` as<br>
|  representing an inhabitant of `a`. I'm probably missing something<br>
|  here.<br>
|  ><br>
|  ><br>
|  ><br>
|  > I also don't think that a free object construction embodies a<br>
|  reify/reflect pair completely. It's probably fair to see `reify` as<br>
|  being the natural mapping from the free object of X to X (the counit<br>
|  of the adjunction). But reification will not be the unit of the<br>
|  adjunction, because it's trivial. So there is still a piece missing in<br>
|  this story.<br>
|  ><br>
|  ><br>
|  ><br>
|  > Anyway... I've made my point, and I am not too willing to spend too<br>
|  much time proving Wadler's law correct. So I think I'll stop here,<br>
|  fascinating a conversation though it is.<br>
|  ><br>
|  ><br>
|  ><br>
|  > Best,<br>
|  ><br>
|  > Arnaud<br>
|  ><br>
|  > _______________________________________________<br>
|  > ghc-devs mailing list<br>
|  > <a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
|  ><br>
|  <a href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail" rel="noreferrer" target="_blank">https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail</a>.<br>
|  > <a href="http://haskell.org" rel="noreferrer" target="_blank">haskell.org</a>%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-<br>
|  devs&amp;data=04%7C01<br>
|  ><br>
|  %7Csimonpj%<a href="http://40microsoft.com" rel="noreferrer" target="_blank">40microsoft.com</a>%7C87da21fdcc8e4ed6bef508d908c071fb%7C72f988<br>
|  ><br>
|  bf86f141af91ab2d7cd011db47%7C1%7C0%7C637550444930791696%7CUnknown%7CTW<br>
|  ><br>
|  FpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6<br>
|  ><br>
|  Mn0%3D%7C1000&amp;sdata=4JfXyRNMjQKTSLqme2VJU9Dy0s6N4Y8t%2BINHYp38xJk%<br>
|  > 3D&amp;reserved=0<br>
</blockquote></div>