According to pointfree
:
\x -> (x, x)
is equivalent to:
join (,)
What is the derivation that shows this?
Look at the type signatures:
\x -> (x, x) :: a -> (a, a) (,) :: a -> b -> (a, b) join :: Monad m => m (m a) -> m a
It should be noted that ((->) r)
is an instance of the Monad
typeclass. Hence, on specializing:
join :: (r -> r -> a) -> (r -> a)
What join
does for functions is apply the given function twice to the same argument:
join f x = f x x -- or join f = \x -> f x x
From this, we can see trivially:
join (,) = \x -> (,) x x -- or join (,) = \x -> (x, x)
Qed.
I like Aadits intuitive answer. Here's how I'd figure it out by reading the source code.
join
join
join
join x = x >>= id
join (,) = (,) >>= id
>>=
on Hoogle and click the link (,)
which is a function, so I click "source" on the Monad ((->) r)
instance f >>= k = \r -> k (f r) r
f = (,)
and k = id
, we get \r -> id ((,) r) r
id
! I search for that on Hoogle, and click through to its source code id x = x
join (,)
we now have \r -> ((,) r) r
\r -> (,) r r
\r -> (r,r)
Never forget that the Haddocks link through to the source code of the library. That's immensely useful when trying to figure out how things work together.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With