Используемая вами переменная x
является локальной для анонимной функции, которую вы используете.В результате функция всегда возвращает Some 1
.Вероятно, вы хотели, чтобы функция принимала аргумент:
let rec from_fun f n =
match f n with
| None -> Nil
| Some e -> Cons(e, from_fun f e)
let seq = from_fun (fun x -> if x<10 then Some (x+1) else None) 0
РЕДАКТИРОВАТЬ: Вот решение с соответствующей сигнатурой типа:
let rec from_fun f () =
match f () with
| None -> Nil
| Some e -> Cons(e, from_fun f ())
let x = ref 0
let seq = from_fun
(fun () ->
let v = !x in
if v < 10
then begin
x := v + 1;
Some v
end
else None)
()
Стоит отметить, чтоиз-за побочных эффектов вам придется повторно инициализировать x
перед созданием новой последовательности.Аргумент unit
, передаваемый параметру в from_fun
, не нужен, его можно удалить.