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 some
and many
in U1
's Alternative
instance,
instance Alternative U1 where
empty = U1
U1 <|> U1 = U1
some U1 = U1
many U1 = U1
It seems that the default definitions of some
and 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.