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

F# 如何基于不同的序列生成序列,f#,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等等 我不知道该怎么做 对于那些熟悉它的人来说,这显然是一个生成素数的数字轮,但我认为知道这一点对答案没有多大影响。:) 您可以通

我有这样的顺序:

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

我不知道该怎么做

对于那些熟悉它的人来说,这显然是一个生成素数的数字轮,但我认为知道这一点对答案没有多大影响。:)

您可以通过以下方式完成:

您可以通过以下方式完成:


我认为,如果您只想使用序列表达式来执行此操作,则需要使用可变的
ref
单元格:

let wheel = seq { 
    let result = ref 5
    yield !result
    while true do
        for x in wheel235 do
            result := !result + x
            yield !result
    }
但我认为更好的方法是将您的代码与
Seq.scan
(如bu LukeH所建议的)结合起来,以不适当地重复
wheel235
(在修复语法错误后):


我认为,如果您只想使用序列表达式来执行此操作,则需要使用可变的
ref
单元格:

let wheel = seq { 
    let result = ref 5
    yield !result
    while true do
        for x in wheel235 do
            result := !result + x
            yield !result
    }
但我认为更好的方法是将您的代码与
Seq.scan
(如bu LukeH所建议的)结合起来,以不适当地重复
wheel235
(在修复语法错误后):


如果我正确理解了这个问题,我认为结果应该是一个不合适的序列。@svick:我认为你可能是对的,但从我最初的阅读来看,我不确定。如果是这样的话,OP可以将他们的
wheel
序列导入
scan
,而不是
wheel235
。@svick:刚才你在自己的回答中提到了这一点。向上投票:)是的,对不起,我的意思是说它是无限的。快凌晨3点了,所以我想我想得不够透彻我之前看过扫描,但从MSDN描述中还不太了解它是如何工作的。非常感谢您提供的答案和示例。如果我正确理解了问题,我认为结果应该是一个不合适的序列。@svick:我认为您可能是对的,但从我最初的阅读来看,我不确定。如果是这样的话,OP可以将他们的
wheel
序列导入
scan
,而不是
wheel235
。@svick:刚才你在自己的回答中提到了这一点。向上投票:)是的,对不起,我的意思是说它是无限的。快凌晨3点了,所以我想我想得不够透彻我之前看过扫描,但从MSDN描述中还不太了解它是如何工作的。非常感谢您提供的答案和示例。我也将语法错误归咎于夜间的时间。;)这在我的代码中是正确的,但在我简化问题的过程中迷失了方向。谢谢你的回答!我把语法错误也归咎于晚上的时间这在我的代码中是正确的,但在我简化问题的过程中迷失了方向。谢谢你的回答!
let wheel = seq { while true do yield! wheel235 } |> Seq.scan (+) 5