Plain old natural numbers will not do the trick, because you can't calculate the natural number length of an infinite list in finite time. However, lazy natural numbers can do it.
import Data.Function (on)
data Nat = Z | S Nat
deriving (Eq, Ord)
len :: [a] -> Nat
len = foldr (const S) Z
isLonger :: [a] -> [b] -> Bool
isLonger = (>) `on` len
You can do it even more compactly using lists to represent lazy natural numbers.
isLonger :: [a] -> [b] -> Bool
isLonger = (>) `on` (() <$)
Of course, if both lists are infinite, you are doomed to an infinite loop no matter what you do.
If you are worried about incompletely defined lists as well as infinite ones, you can be a little lazier using a custom Ord instance for Nat:
instance Ord Nat where
compare Z Z = EQ
compare Z (S _) = LT
compare (S _) Z = GT
compare (S x) (S y) = compare x y
Z <= _ = True -- lazy in the second argument
S _ <= Z = False
S x <= S y = x <= y
x >= y = y <= x
x > y = not (x <= y)
x < y = y > x
Now if the first list is empty, isLonger will return False even if the second list is undefined.