Что является производным, который показывает \x -> (x, x) в Haskell, эквивалентный join (,)?

В соответствии с pointfree:

\x -> (x, x)

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

join (,)

Какое происхождение показывает это?

2 ответа

Решение

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

\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.

Мне нравится Адиц, интуитивно понятный ответ. Вот как я могу это понять, прочитав исходный код.

  1. Я хожу в гугл
  2. Я ищу join
  3. Я нажимаю на join
  4. Я нажимаю кнопку "Исходный код", чтобы перейти к исходному коду join
  5. я вижу это join x = x >>= id
  6. Итак, я знаю, что join (,) = (,) >>= id
  7. Я ищу >>= в Google и нажмите на ссылку
  8. Я вижу, что это часть класса типов монада, и я знаю, что имею дело с (,) которая является функцией, поэтому я нажимаю "источник" на Monad ((->) r) пример
  9. я вижу это f >>= k = \r -> k (f r) r
  10. Так как у нас есть f = (,) а также k = id, мы получаем \r -> id ((,) r) r
  11. Ооочень... новая функция! id! Я ищу это в Google и нажимаю на его исходный код.
  12. Оказывается id x = x
  13. Так что вместо join (,) теперь у нас есть \r -> ((,) r) r
  14. Что то же самое, что \r -> (,) r r
  15. Что то же самое, что \r -> (r,r)

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

Другие вопросы по тегам