2015-04-18 6 views

Antwort

30

Blick auf die Art Signaturen:

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

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

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

Es sollte beachtet werden, dass ((->) r) eine Instanz des Monad typeclass ist. Daher auf Spezialisierung:

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

Was join für Funktionen tut, ist die gegebene Funktion zweimal auf das gleiche Argument gilt:

join f x = f x x 

-- or 

join f = \x -> f x x 

Von diesem können wir trivialer sehen:

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

-- or 

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

Qed.

22

Ich mag Aadits intuitive Antwort. Hier ist, wie ich es herausfinden würde, indem ich den Quellcode lese.

  1. Ich gehe zu Hoogle
  2. Ich suche join
  3. I click on join
  4. ich auf die "Quelle", um the source code for join
  5. Ich sehe zu bekommen, dass join x = x >>= id
  6. Also ich weiß, dass join (,) = (,) >>= id
  7. I search for >>= on Hoogle and click the link
  8. Ich sehe, dass es einen Teil der Monade typeclass ist, und ich weiß, dass ich mit (,) zu tun habe, die eine Funktion ist, so dass ich click "source" on the Monad ((->) r) instance
  9. Ich sehe, dass f >>= k = \r -> k (f r) r
  10. Da wir f = (,) und k = id haben wir \r -> id ((,) r) r bekommen
  11. Sooo ... neue Funktion! id! Ich suche für das An- Hoogle und click through to its source code
  12. Es stellte sich heraus id x = x
  13. Also statt join (,) wir jetzt \r -> ((,) r) r
  14. haben, die dasselbe ist wie \r -> (,) r r
  15. , die die gleiche Sache wie \r -> (r,r) ist

Vergessen Sie nie, dass sich die Haddocks mit dem Quellcode der Bibliothek verbinden. Das ist immens nützlich, wenn Sie herausfinden wollen, wie die Dinge zusammen funktionieren.

+3

Das ist schön für Anfänger.Diese Art von Antworten zu schreiben ist immens nützlich für Neuankömmlinge. –

Verwandte Themen