Richard Eisenberg lists at richarde.dev
Sun Sep 19 21:04:53 UTC 2021

```Other understandings of informal terms will differ, but here is how I see it:

* "Workflow" applies equally well to Monad as to Arrow. Both capture the idea of information flowing from one computation to the next.

* "Programmable semicolon" seems a better fit for Monad than for Arrow. In C, I can say:

> int result = do_some_thing();
> if (result > 10)
>   big_result();
> else
>   small_result();

That is, the future flow of my computation can depend on an earlier result. This is possible with Monad but not with Arrow. So, if I had thought that Arrow was a programmable semicolon, I would have felt short-changed a bit when actually learning what Arrow was.

Popping up a level: for me, the value in these ideas is not their precision, but rather their familiarity. Give me intuition first, correctness later.

Sidenote (please feel free to skip!): In later secondary school and throughout university, I kept learning things that refined earlier knowledge -- indeed suggesting that earlier knowledge was wrong. For example, radians are *much* more convenient to work with than degrees, which are kind of ridiculous. I resolved then that I would teach my kids how to measure angles in radians from the start: why bother with the inferior unit? Now I have a daughter, who is learning degrees. Why? Because degrees are simpler to start with: we can describe a circle or a right angle without any irrational numbers! So, we build intuition with degrees, and then she'll switch to radians when the time comes. Another example: we now know that object do not accelerate parabolically under the influence of gravity, because of general relativity. But general relativity is hard, so we still teach about parabolic curves for objects in freefall. Once a student knows more physics, they can return and refine their knowledge.

So can it be with Haskell. We sometimes get so caught up in being "right" and precise, that we forget that it is sometimes useful to paper over some details for the sake of intuition. This means we sometimes have to say "wrong" things. (For example, I have said that "IO Int" is just an Int tagged with a flag that says the function can do I/O and must be written with do-notation.) But if the goal is learning, sometimes the "wrong" thing is the right thing.

Richard

> On Sep 18, 2021, at 4:00 AM, Tom Ellis <tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk> wrote:
>
> On Sat, Sep 18, 2021 at 11:56:37AM +0900, Michael Turner wrote:
>> Workflow is a metaphor at one useful level. "Programmable semicolon"
>> is a metaphor at another useful level.
> [...]
>> "Workflow" helped me. And now "programmable semicolon" is helping a
>> little, in another way.
>
> What troubles me about "workflow" and "programmable semicolon" is the
> question of whether they also apply to Arrow[1].
>
> * If they do, then in what sense can "workflow" and "programmable
>  semicolon" said to help with understanding of *Monad*?
>
> * If they don't, then why not?  I don't see it.
>
> One possible answer is that they do, but those descriptions are only
> details (I think this is what Michael is suggesting).
>
> Tom
>
>
>