From what I understand, this code

main = forever $ do
  putStrLn "OK !"

is equivalent to this one :

main = do
  putStrLn "OK !"
  main


In the second case, it's a simple recursion, so far so good ... but when I look at the implementation of "forever" i can't wrap my head around :

http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#forever

forever a   = let a' = a *> a' in a'
How does this works ? How does this make an infinite loop ?

I understand that *> discard his right argument but it doesn't help me understand how forever implement an infinite loop ...