Documentation does not mention that default definitions for Alternative(some, many) can easily blow up
Consider this case (taken from #11649 (closed))
import Control.Applicative data U1 p = U1 instance Functor U1 where fmap f U1 = U1 instance Applicative U1 where pure _ = U1 U1 <*> U1 = U1 instance Alternative U1 where empty = U1 U1 <|> U1 = U1 instance Show (U1 p) where show U1 = "U1" main = print (some U1)
This looks fine, right? Wrong,
$ ./Main Main: <<loop>>
Of course, this can be avoided by simply defining
instance Alternative U1 where empty = U1 U1 <|> U1 = U1 some U1 = U1 many U1 = U1
It seems that the default definitions of
many will produce looping code in these cases (although it's not entirely clear to me which cases "these" cases are).
I suppose this is due to the fact that
U1 will always "succeed". We should note this in the documentation to ensure that users don't end up with accidentally bottoming instances.