name = ID "string"
number :: Expression
number = Num 123
whileParser :: Parser Expression
whileParser = whiteSpace >> expr8
expr8 :: Parser Expression
expr8 = name
<|> number
You have defined name to be an Expression. But <|> composes *parsers*, not expressions. To create a Parser Expression, you would be composing (Parser Expression)s, not simply (Expression)s; so you don't want "name" to be simply an Expression, but a Parser that parses an input String and produces an Expression, something like
name :: Parser Expression
name = ID <*> identifier -- parse an identifier, wrap it in an ID
number :: Parser Expression
number = Num <*> integer -- parse an integer, wrap it in a Num
--