Hello Mr Elliot,
Yannick Spark

You appear to be arguing out of context against a claim I am not making.

The original comment I was responding to argued that I can’t represent join as `M(a) => a` (which I did in the original article to point out the symmetry between lift and join, and for no other reason).

Unless you are arguing that `M(M(a))` is NOT a member of `M(x)` (which would be silly because `x` could stand in for any type, including `M(a)`), we appear to be in violent agreement on most counts — with an important exception:

Identity is NOT a special case where signatures are concerned. It follows all the same laws and obeys all the same signatures, meaning you can use it anywhere you’d use another monad and it would work fine using parametric polymorphism with no special dispatch.

Since the only question at issue is whether or not I can make a valid type substitution to a more generalized type for illustrative purposes, signature is the only salient difference we’re talking about.

I am not arguing that all cases of `M(x)` would work for all cases of join. Only that you can view any join `M(M(a))` as a member of `M(x)`.

An argument against that point would be an argument against any subtype in type theory.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.