我有这个序列:
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等......
我无法完全理解如何做到这一点。
对于那些熟悉它的人来说,它显然是素数生成的一个数字轮,但我不认为知道这对答案很重要。 :)
答案 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