如何基于不同的序列生成序列

时间:2013-04-26 23:51:06

标签: f#

我有这个序列:

let wheel235 = [4; 2; 4; 2; 4; 6; 2; 6]
let wheel = seq { while true yield! wheel235 }

我想建立一个以特定数字开头的第二个序列,该序列中的每个后续数字都是前一个数字,并且轮子序列中的下一个项目被添加到它。所以,如果我在5开始这个序列,我会有5,9,11,15,17,21,27等......

我无法完全理解如何做到这一点。

对于那些熟悉它的人来说,它显然是素数生成的一个数字轮,但我不认为知道这对答案很重要。 :)

2 个答案:

答案 0 :(得分:7)

您可以使用Seq.scan

执行此操作
let wheel235 = [4; 2; 4; 2; 4; 6; 2; 6]
let wheel = seq { while true do yield! wheel235 }

let result = wheel |> Seq.scan (+) 5

# result will be 5, 9, 11, 15, 17, 21, 27, etc

答案 1 :(得分:3)

我认为如果你只想使用序列表达式来实现这一点,你需要使用一个可变的ref单元格:

let wheel = seq { 
    let result = ref 5
    yield !result
    while true do
        for x in wheel235 do
            result := !result + x
            yield !result
    }

但我认为更好的方法是将您的代码与wheel235无关地(在修复语法错误后)重复Seq.scan(如建议的Lu LuH):

let wheel = seq { while true do yield! wheel235 } |> Seq.scan (+) 5