data NR s e = Succ s e | Pred s e
tolist (Succ s e) = [s..e]
tolist (Pred s e) = [ s + (e - x) | x <- [s..e]]
reverse_ (Succ s e) = (Pred s e)
reverse_ (Pred s e) = (Succ s e)
take_ n (Succ s e) = Succ s (s + n)
take_ n (Pred s e) = Pred (e - n) e

tolist (reverse_ (take_ 3 (reverse_ (Pred 123 1000000000))))
[126,125,124,123]

haskellはよく解らないのですが、これでどうですか?