&gt; I think it&#x27;s clearer if you don&#x27;t bring in the lemma.<p>Well of course it&#x27;s clearer, it&#x27;s because you&#x27;re working with specific example, whereas Yoneda applies in a very general setting, you just have to see how you can &quot;squint&quot; and see the general setup in the specific case.<p>People always talk about a category Hask, but you can easily imagine a category &quot;C&quot; in an analogous way. You can also imagine an &quot;SSA&quot; category of a static single-assignment intermediate language of a compiler. Compilation would be a functor from C to SSA. Likewise you can consider an (endo)functor from C to C which turns a function from direct style to CPS, and then run the compiler to get SSA. You can then ask is the SSA generated in both steps the same &quot;semantically&quot;. Actually proving that in all its gory detail is simplified by making the right setup as explicated by user tel and then applying the Yoneda lemma at the right moment to conclude the proof.<p>More interestingly you can ask questions like does an SSA optimisation, an (endo)functor on SSA correspond to some optimisation in C that could be a source-to-source transform.<p>Etc, etc.<p>The purpose of mathematical abstraction is simplification, even though it may transmogrify the concrete into a seemingly unpalatable form.