Подтвердить что ты не робот

Что такое вывод, который показывает, что Haskell\x → (x, x) эквивалентно join (,)?

Согласно pointfree:

\x -> (x, x)

эквивалентно:

join (,)

Что такое вывод, который показывает это?

4b9b3361

Ответ 1

Посмотрите на подписи типов:

\x -> (x, x) :: a -> (a, a)

(,)          :: a -> b -> (a, b)

join         :: Monad m => m (m a) -> m a

Следует отметить, что ((->) r) является экземпляром класса Monad. Следовательно, по специализации:

join         :: (r -> r -> a) -> (r -> a)

Что join для функций применяет данную функцию дважды к одному и тому же аргументу:

join f x = f x x

-- or

join f = \x -> f x x

Из этого мы можем видеть тривиально:

join (,) = \x -> (,) x x

-- or

join (,) = \x -> (x, x)

QED.

Ответ 2

Мне нравится интуитивный ответ Aadits. Вот как я понял бы это, читая исходный код.

Никогда не забывайте, что Haddocks ссылаются на исходный код библиотеки. Это очень полезно при попытке выяснить, как все работает вместе.