~ more reasonable fail and (<*>)
~ minor fix
+ MonadPlus, MonadIO