1

我有这个序列:

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 等...

我不知道该怎么做。

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

4

2 回答 2

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
于 2013-04-27T00:20:40.350 回答
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(如建议的 bu LukeH):

let wheel = seq { while true do yield! wheel235 } |> Seq.scan (+) 5
于 2013-04-27T00:33:46.133 回答