Что такое вывод, который показывает, что Haskell\x → (x, x) эквивалентно join (,)?
Согласно pointfree
:
\x -> (x, x)
эквивалентно:
join (,)
Что такое вывод, который показывает это?
Ответы
Ответ 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. Вот как я понял бы это, читая исходный код.
- Я перехожу к Hoogle
- Я ищу
join
- я нажмите
join
- Я нажимаю кнопку "источник", чтобы перейти к исходному коду
join
- Я вижу, что
join x = x >>= id
- Итак, я знаю, что
join (,) = (,) >>= id
- я найдите
>>=
в Hoogle и нажмите ссылку
- Я вижу, что это часть стилей monad, и я знаю, что имею дело с
(,)
, которая является функцией, поэтому я нажимаю "source" на Monad ((->) r)
экземпляр
- Я вижу, что
f >>= k = \r -> k (f r) r
- Так как мы имеем
f = (,)
и k = id
, получаем \r -> id ((,) r) r
- Sooo... новая функция!
id
! Я ищу это в Hoogle и перейдите в исходный код
- Выключает
id x = x
- Итак, вместо
join (,)
мы имеем \r -> ((,) r) r
- Это то же самое, что
\r -> (,) r r
- Это то же самое, что
\r -> (r,r)
Никогда не забывайте, что Haddocks ссылаются на исходный код библиотеки. Это очень полезно при попытке выяснить, как все работает вместе.