You need to add constructor names for each alternative:
data NumPair = Pair (Int, Int) | More (Int, NumPair) deriving (Eq, Show)
Those constructor names are what let you pattern match on the data type like so:
f :: NumPair -> A
f (Pair (x, y )) = ...
f (More (x, np)) = ...
You can then build a value using the constructors to (which is why they are called constructors):
myNumPair :: NumPair
myNumPair = More (1, More (2, Pair (3, 4)))
There are two other ways you can improve your type. Haskell constructors have built-in support for multiple fields, so rather than using a tuple you can just list the values directly in the constructor like this:
data NumPair = Pair Int Int | More Int NumPair deriving (Eq, Show)
Another way you can improve upon it is to recognize that you've just written the type for a non-empty list. The best implementation for non-empty lists resides in Data.List.NonEmpty of the semigroups package, which you can find here.
Then your type just becomes:
type NumPair = NonEmpty Int
... and you get a bunch of function on non-empty lists for free from that module.
Edit: n.m. brought to my attention that what you probably wanted was:
data NumPair = Pair (Int, Int) | More ((Int, Int), NumPair)
... which is equivalent to:
type NumPair = NonEmpty (Int, Int)
The difference is that this latter one lets you append pairs of integers, where as the previous one that followed your question's type only lets you append integers.