`const`

, which felt shaky indeed!
]]>

const :: (1 ↣ b) -> (a ↣ b) const e = e ∘ it

where it :: a ↣ 1 is the unique morphism from a to 1.

Now given CCC morphisms g :: b ↣ c and f :: a ↣ b, we may view

g ∘ exr :: (1 × b) ↣ c

and let

g' = curry (g ∘ exr) :: 1 ↣ (b ⇨ c)

Then

const g' :: a ↣ (b ⇨ c) const g' = g' ∘ it = curry (g ∘ exr) ∘ it

and we have

apply ∘ (const g' △ f) = apply ∘ (curry (g ∘ exr) ∘ it △ f) = apply ∘ (curry (g ∘ exr) ∘ it △ id ∘ f) = apply ∘ (curry (g ∘ exr) ∘ exl △ id ∘ exr) ∘ (it △ f) = apply ∘ (curry (g ∘ exr) ∘ exl △ exr) ∘ (it △ f) = (g ∘ exr) ∘ (it △ f) = g ∘ (exr ∘ (it △ f)) = g ∘ f

using the defining property of ‘curry’ that for any f : c × a -> b,

f = apply ∘ (curry f ∘ exl △ exr)

and the result

h ∘ f △ k ∘ g = (h ∘ exl △ k ∘ exr) ∘ (f △ g)]]>

apply ∘ (const g △ f) = apply ∘ (curry (g ∘ exr) △ f) -- expand definition of const = apply ∘ (curry (g ∘ exr) × id) ∘ (id △ f) -- naturality of fork, tacitly adding some ids = g ∘ exr ∘ (id △ f) -- universal property of apply = g ∘ f -- (half of) universal property of pairs]]>