Haskell --> F#: Turner's Sieve

前端 未结 4 1352
暖寄归人
暖寄归人 2020-12-29 15:21

I was reading on different sieving algorithms when I stumbled upon a kind of improved version of the Sieve of Eratosthenes called Euler\'s Sieve. According to Wikipedia ther

4条回答
  •  独厮守ぢ
    2020-12-29 16:00

    You can do it with seq. And as you got minus done, euler itself is same as in Haskell.

    let rec minus xs ys =
      seq {
        match Seq.isEmpty xs, Seq.isEmpty ys with
        | true,_ | _,true -> yield! xs
        | _ ->
           let x,y = Seq.head xs, Seq.head ys
           let xs',ys' = Seq.skip 1 xs, Seq.skip 1 ys
           match compare x y with
           | 0 -> yield! minus xs' ys'
           | 1 -> yield! minus xs ys'
           | _ -> yield x; yield! minus xs' ys
      }
    
    let rec euler s =
      seq {
        let p = Seq.head s
        yield p
        yield! minus (Seq.skip 1 s) (Seq.map ((*) p) s) |> euler
      }
    
    let primes = Seq.initInfinite ((+) 2) |> euler
    

提交回复
热议问题