data Ni e = Infinity | Limit e
data Nt = Succ | Pred
data Nrs s e li = Li Nt s (Ni e)
tolist (Li t s e) = case (t,e) of
(Succ,Limit l) -> [s..l]
(Succ,Infinity) -> [s..]
(Pred,Limit l) -> [ s + (l - x) | x <- [s..l]]
reverse_ (Li t s e) = case t of
Succ -> Li Pred s e
Pred -> Li Succ s e
take_ n (Li t s e) = case (t,e) of
(Succ,Limit l) -> Li t s (Limit (min (s + n - 1) l))
(Succ,Infinity) -> Li t s (Limit (s + n - 1))
(Pred,Limit l) -> Li t (max s (l - n + 1)) (Limit l)

tolist (reverse_ (take_ 3 (reverse_ (reverse_ (Li Succ 123 Infinity)))))

もういいよコードが読めないならわからなくていいよ。