Вот что я до сих пор:
type Maybe<'a> = option<'a>
let succeed x = Some(x)
let fail = None
let bind rest p =
match p with
| None -> fail
| Some r -> rest r
let rec whileLoop cond body =
if cond() then
match body() with
| Some() ->
whileLoop cond body
| None ->
fail
else
succeed()
let forLoop (xs : 'T seq) f =
using (xs.GetEnumerator()) (fun it ->
whileLoop
(fun () -> it.MoveNext())
(fun () -> it.Current |> f)
)
whileLoop
отлично работает для поддержки циклов for
, но я не вижу, как можно получить, пока поддерживаются петли. Часть проблемы заключается в том, что для перевода циклов while используется delay
, чего я не мог понять в этом случае. Очевидная реализация ниже, вероятно, неверна, поскольку она не задерживает вычисление, а запускает ее вместо этого.
let delay f = f()
Отсутствие задержки также препятствует try...with
и try...finally
.