2015-04-18 9 views

Odpowiedz

30

Spójrz na podpisami typu:

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

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

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

Należy zauważyć, że ((->) r) jest instancją Monad typeclass. Stąd na specjalizujący:

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

Co join robi dla funkcji jest zastosowanie danej funkcji dwa razy do tego samego argumentu:

join f x = f x x 

-- or 

join f = \x -> f x x 

od tego, widzimy trywialnie:

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

-- or 

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

Co było do okazania.

22

Uwielbiam intuicyjną odpowiedź Aadits. Oto, jak to wymyśliłem, czytając kod źródłowy.

  1. idę Hoogle
  2. wyszukać join
  3. I click on join
  4. kliknięciu przycisku "Źródło", aby dostać się do the source code for join
  5. widzę, że join x = x >>= id
  6. Więc wiem, że join (,) = (,) >>= id
  7. I search for >>= on Hoogle and click the link
  8. widzę, że jest to część typeclass monada, a wiem, że mam do czynienia z (,) która jest funkcją, więc click "source" on the Monad ((->) r) instance
  9. widzę, że f >>= k = \r -> k (f r) r
  10. Ponieważ mamy f = (,) i k = id, otrzymujemy \r -> id ((,) r) r
  11. Sooo ... nowa funkcja! id! I sprawdzić, że na Hoogle i click through to its source code
  12. Okazuje się id x = x
  13. więc zamiast join (,) mamy teraz \r -> ((,) r) r
  14. który jest tym samym, co \r -> (,) r r
  15. Który jest tym samym, co \r -> (r,r)

Nigdy nie zapominaj, że plamki łączą się z kodem źródłowym biblioteki. Jest to niezmiernie przydatne, gdy próbujemy zrozumieć, jak działają razem.

+3

To jest piękne dla początkujących.Pisanie takich odpowiedzi jest niezmiernie przydatne dla nowych osób. –