Немного опоздал к игре, но вот моя реализация:
let rec range ?(start=0) len =
if start >= len
then []
else start :: (range len ~start:(start+1))
Затем вы можете использовать его очень похоже на функцию python:
range 10
(* equals: [0; 1; 2; 3; 4; 5; 6; 7; 8; 9] *)
range ~start:(-3) 3
(* equals: [-3; -2; -1; 0; 1; 2] *)
естественно, я думаю, что лучший ответ - просто использовать Core, но это может быть лучше, если вам нужна только одна функция и вы пытаетесь избежать полной структуры.