<html><head></head><body><div><div><div style="display: none; border: 0px; width: 0px; height: 0px; overflow: hidden; visibility: hidden;"><img src="https://r.superhuman.com/0Wx-exEsht6lpb99fo4UQiWIkL98SYOEzLJUv1QFFhli5bllkNoHDBLsayQDodhx8cUxnSyJTqe7dnp6-rT9qAIxGYEoTGbjxFniaPkNXNYPNGwW28U3w7OH-Ha5dqTJNOY5Lv3a8yLSaZJO9r_ZF2xLtuAYQQTH7MWHJvQSHLQU2hbjV-rdY8M.gif" alt=" " width="1" height="0" style="display: none; border: 0px; width: 0px; height: 0px; overflow: hidden; visibility: hidden;"/><!-- --></div><div><div><div>Just to clarify, that's not the "real" diagonal in the space, but it is a super useful translation that I'd like for free :)</div></div><br/><div class="gmail_signature"></div></div><br/><div><div class="gmail_quote">On Wed, Sep 16, 2020 at 9:08 PM, Emily Pillmore <span dir="ltr"><<a href="mailto:emilypi@cohomolo.gy" target="_blank">emilypi@cohomolo.gy</a>></span> wrote:<br/><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div class="gmail_quote sh-color-black sh-color" style="null" id="null"><div class="sh-color-black sh-color"><div class="sh-color-black sh-color"><div class="sh-color-black sh-color"><div class="sh-color-black sh-color">@Asad that's a perfectly reasonable way to think about diagonal operations: as the data of a cartesian monoidal category, and the laws are correct in this case. I think we can get away with the additional abstraction to `Biapplicative` in this case, though.<br/></div><div class="sh-color-black sh-color"><br/></div><blockquote class="sh-color-black sh-color"><div class="MessagePane-iframe-wrapper sh-color-black sh-color" style="text-decoration-color:initial;text-decoration-style:initial;text-decoration-line:none;"><div class="Shadowbox sh-color-black sh-color" style="text-decoration-skip-ink:initial;text-decoration-color:initial;text-decoration-style:initial;text-decoration-line:none;font-style:initial;"><div class="sh-color-black sh-color"><div class="oldSignatureStyling sh-color-black sh-color"><div class="ShadowBody sh-color-black sh-color"><div class="sh-color-black sh-color"><div class="sh-color-black sh-color"><div class="sh-color-black sh-color" tabindex="-1"><div class="unquoted-content sh-color-black sh-color"><p class="sh-color-black sh-color" style="margin:0px;">wouldn't the existence of appropriate `forall a. a -> t a a` and `forall a. x -> Unit t` functions pigeonhole it into being "the" cartesian monoidal structure on `->` (and thus naturally isomorphic to `(,)`)?<br/></p></div></div></div></div></div></div></div></div></div></blockquote><div class="sh-color-black sh-color"><div class="sh-color-black sh-color"><br/></div><div class="sh-color-black sh-color">Only if you chose that particular unit and that particular arrow. But there are other places where having a general `Biapplicative` contraint would make it useful. For example, i'd like to use this in `smash` with `diag :: a → Smash a a`, defining the adjoining of a point to `a` and creating a diagonal in the subcategory of pointed spaces in Hask, so that I don't have to redefine this as `diag' = quotSmash . view _CanIso . diag . Just`. <br/></div><div class="sh-color-black sh-color"><br/></div><div class="sh-color-black sh-color">Cheers,<br/></div><div class="sh-color-black sh-color">Emily</div><div class="sh-color-black sh-color"><br/></div><div class="sh-color-black sh-color"><br/></div><div class="sh-color-black sh-color"><br/></div><div class="sh-color-black sh-color"><br/></div></div><div class="sh-color-black sh-color"><br/></div></div><br/><div class="gmail_signature sh-color-black sh-color"></div></div><br/><div class="sh-color-black sh-color"><div class="gmail_quote sh-color-black sh-color">On Wed, Sep 16, 2020 at 6:35 PM, Asad Saeeduddin <span dir="ltr" class="sh-color-black sh-color"><<a href="mailto:masaeedu@gmail.com" target="_blank" rel="noopener noreferrer">masaeedu@<wbr/>gmail.<wbr/>com</a>></span> wrote:<br/><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex" class="gmail_quote sh-color-black sh-color"><div class="gmail_extra sh-color-black sh-color"><div id="null" style="null" class="gmail_quote sh-color-black sh-color"><p class="sh-color-black sh-color">Whoops, I just realized I've been responding to Carter
specifically instead of to the list.<br/>
<br/>
I was having some trouble understanding the `unJoin` stuff but I
read it a few more times and I think I understand it a little
better now.<br/>
<br/>
In my personal experience the "abstracted version" of `x -> (x,
x)` I use most often looks like this:<br/>
<br/>
```<br/>
</p>
<pre class="sh-color-black sh-color">class SymmetricMonoidal t i p => CartesianMonoidal t i p</pre>
<pre class="sh-color-black sh-color"> where</pre>
<pre class="sh-color-black sh-color"> duplicate :: p x (x `t` x)</pre>
<pre class="sh-color-black sh-color"> discard :: p x i
</pre>
<pre class="sh-color-black sh-color">-- Laws:</pre>
<pre class="sh-color-black sh-color">-- duplicate >>> first discard = fwd lunit</pre>
<pre class="sh-color-black sh-color">-- duplicate >>> second discard = fwd runit
</pre>
<pre class="sh-color-black sh-color">-- where</pre>
<pre class="sh-color-black sh-color">-- lunit :: Monoidal t i p => Iso p x (i `t` x)</pre>
<pre class="sh-color-black sh-color">-- runit :: Monoidal t i p => Iso p x (x `t` i)</pre>
<p class="sh-color-black sh-color">```<br/>
<br/>
i.e. adding a suitable duplicate and discard to some symmetric
monoidal structure gives us a cartesian monoidal structure.<br/>
<br/>
This doesn't really seem to be relevant to what you folks are
looking for, but it does bring up a question. If some `Bifunctor`
`t` happens to form a monoidal structure on `->`, wouldn't the
existence of appropriate `forall a. a -> t a a` and `forall a.
x -> Unit t` functions pigeonhole it into being "the" cartesian
monoidal structure on `->` (and thus naturally isomorphic to
`(,)`)?</p>
<div class="moz-cite-prefix sh-color-black sh-color">On 9/16/20 5:26 PM, Emily Pillmore
wrote:<br/>
</div>
<blockquote class="sh-color-black sh-color" type="cite" cite="mid:kf5vrsny.e6040fe7-b608-4b4c-9b9a-cca791581d3e@we.are.superhuman.com">
<div class="sh-color-black sh-color">
<div class="sh-color-black sh-color">
<div class="sh-color-black sh-color">
<div class="sh-color-black sh-color">
<div class="sh-color-black sh-color">Nice! <br/>
<br/>
That's kind of what I was going for with Carter earlier
in the day, thanks Matthew. </div>
<div class="sh-color-black sh-color"><br/>
</div>
<div class="sh-color-black sh-color">I think a diagonalization function and functor are
both very sensible additions to `bifunctors` and
`Data.Bifunctor`. The theory behind this is sound: The
diagonalization functor Δ: Hask → Hask^Hask, forms the
center of the adjoint triple `colim -| Δ -| lim : Hask →
Hask^Hask`. <br/>
<br/>
Certainly the function `diag :: a → (a,a)` is something
I've seen written in several libraries, and should be
included in `Data.Tuple` as a `base` function. The clear
generalization of this function is `diag ::
Biapplicative f ⇒ a → f a a`. I'm in favor of both
existing in their separate capacities. </div>
<div class="sh-color-black sh-color"><br/>
</div>
<div class="sh-color-black sh-color">Thoughts? <br/>
</div>
<div class="sh-color-black sh-color"><br/>
</div>
<div class="sh-color-black sh-color">Emily</div>
</div>
<br/>
</div>
<br/>
<div class="sh-color-black sh-color">
<div class="gmail_quote sh-color-black sh-color">On Wed, Sep 16, 2020 at 3:49 PM,
Carter Schonwald <span class="sh-color-black sh-color" dir="ltr"><<a rel="noopener noreferrer" href="mailto:carter.schonwald@gmail.com" target="_blank">carter.<wbr/>schonwald@<wbr/>gmail.<wbr/>com</a>></span>
wrote:<br/>
<blockquote class="gmail_quote sh-color-black sh-color" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="gmail_extra sh-color-black sh-color">
<div class="gmail_quote sh-color-black sh-color" style="null" id="null">
<div dir="auto" class="sh-color-black sh-color">Is
the join bipure definition taking advantage of the
(a->) monad instance? Slick!</div>
<div dir="auto" class="sh-color-black sh-color"><br/>
</div>
<div dir="auto" class="sh-color-black sh-color"><br/>
</div>
<div class="sh-color-black sh-color">
<div class="gmail_quote sh-color-black sh-color">
<div class="gmail_attr sh-color-black sh-color" dir="ltr">On Wed, Sep 16, 2020 at 3:39 PM
Matthew Farkas-Dyck <<a href="mailto:strake888@gmail.com" rel="noopener noreferrer" target="_blank">strake888@<wbr/>gmail.<wbr/>com</a>>
wrote:<br/>
</div>
<blockquote style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex" class="gmail_quote sh-color-black sh-color">We also have<br/>
<br/>
<br/>
<br/>
diag = join bipure<br/>
<br/>
<br/>
<br/>
and (in pseudo-Haskell)<br/>
<br/>
<br/>
<br/>
diag = unJoin . pure<br/>
<br/>
where<br/>
<br/>
newtype Join f a = Join { unJoin :: f a a
} deriving (Functor)<br/>
<br/>
deriving instance Biapplicative f =>
Applicative (Join f)<br/>
<br/>
<br/>
<br/>
The latter seems on its face potentially
related to the instance for<br/>
<br/>
lists of fixed length, but i am not sure how
deep the connection may<br/>
<br/>
be.<br/>
<br/>
</blockquote>
</div>
</div>
<p class="sh-color-black sh-color">_______________________________________________
<br/>
Libraries mailing list
<br/>
<a rel="noopener noreferrer" href="mailto:Libraries@haskell.org" target="_blank">Libraries@<wbr/>haskell.<wbr/>org</a>
<br/>
<a rel="noopener noreferrer" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" target="_blank">http:/<wbr/>/<wbr/>mail.<wbr/>haskell.<wbr/>org/<wbr/>cgi-bin/<wbr/>mailman/<wbr/>listinfo/<wbr/>libraries</a></p>
</div>
</div>
</blockquote>
</div>
</div>
<br/>
</div>
</div>
<br/>
<fieldset class="mimeAttachmentHeader sh-color-black sh-color"></fieldset>
<pre class="moz-quote-pre sh-color-black sh-color" wrap="">_______________________________________________
Libraries mailing list
<a rel="noopener noreferrer" class="moz-txt-link-abbreviated" href="mailto:Libraries@haskell.org" target="_blank">Libraries@<wbr/>haskell.<wbr/>org</a>
<a rel="noopener noreferrer" class="moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" target="_blank">http:/<wbr/>/<wbr/>mail.<wbr/>haskell.<wbr/>org/<wbr/>cgi-bin/<wbr/>mailman/<wbr/>listinfo/<wbr/>libraries</a>
</pre>
</blockquote>
<p class="sh-color-black sh-color">_______________________________________________
<br/>
Libraries mailing list
<br/>
<a href="mailto:Libraries@haskell.org" rel="noopener noreferrer" target="_blank">Libraries@<wbr/>haskell.<wbr/>org</a>
<br/>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noopener noreferrer" target="_blank">http:/<wbr/>/<wbr/>mail.<wbr/>haskell.<wbr/>org/<wbr/>cgi-bin/<wbr/>mailman/<wbr/>listinfo/<wbr/>libraries</a></p></div></div></blockquote></div></div></div></div></div></blockquote></div></div><br/></div></div></body></html>