logic_ =
| Nil
| Cons of 'a * 'a logic
let inline apply
(yes : ('a * 'a logic) -> 'r)
(no : 'r)
(logic : 'a logic)
: 'r =
match logic.Value with
| Nil -> no
| Cons (x, xs) -> yes (x, xs)
let inline findAtLeast
(n : int)
(logic : 'a logic)
: 'a list =
List.unfold
(fun (n, logic) ->
if n <= 0
then None
else apply (fun (x, xs) -> Some (x, (n - 1, xs))) None logic)
(n, logic)
let rec unfold
(coalg : 'b -> ('a * 'b) option)
(seed : 'b)
: 'a logic =
match coalg seed with
| None -> lazy Nil
| Some (x, seed') -> lazy (Cons (x, unfold coalg seed'))
fairBind (unfold (fun x -> Some (x, x + 1)) 1) (fun x ->
just x)
|> findAtLeast 20
|> printfn "%A"
Переполнение стека. Есть какой-нибудь "стандартный" ленивый список, с unfold?
Seq.unfold?
что здесь fairBind?
Обсуждают сегодня