Если вы хотите имитировать лень Хаскелла, вы можете использовать тип LazyList, найденный в FSharp.PowerPack.dll. LazyList.Cons (p, xs) - это сопоставление с шаблоном, соответствующее p: xs в Haskell. «Задержка» в consDelayed необходима, потому что обычные LazyList.cons будут слишком энергичными и будут бесконечно долго (конечно, с вашим терпением) долго.
Вы также можете найти этот вопрос интересным. Это еще одно простое сито Haskell в F #.
Вот ваш код на F # (к сожалению, довольно уродливый):
#r "FSharp.PowerPack.dll"
//A lazy stream of numbers, starting from x
let rec numsFrom x = LazyList.consDelayed x (fun () -> numsFrom (x+1I))
let rec sieve = function
| LazyList.Cons(p,xs) ->
LazyList.consDelayed p (fun () ->
xs |> LazyList.filter (fun x -> x%p <> 0I) |> sieve)
| _ -> failwith "This can't happen with infinite lists"
let primes() = sieve (numsFrom 2I)
Пример вывода в FSI:
> primes() |> Seq.take 14 |> Seq.toList;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val it : System.Numerics.BigInteger list =
[2I; 3I; 5I; 7I; 11I; 13I; 17I; 19I; 23I; 29I; 31I; 37I; 41I; 43I]