Что такое вывод, который показывает, что 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 ссылаются на исходный код библиотеки. Это очень полезно при попытке выяснить, как все работает вместе.
Ответ 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 ссылаются на исходный код библиотеки. Это очень полезно при попытке выяснить, как все работает вместе.