If you want to do this with higher level functions, I think iterate will work well:
(defn tails [xs] (concat (take-while seq (iterate rest xs)) '(()))
However, I think in this case it would be easy to write it using lazy-seq :
(defn tails [xs] (if-not (seq xs) '(()) (cons xs (lazy-seq (tails (rest xs))))))
source share