List F#创建x的倍数列表?

List F#创建x的倍数列表?,list,f#,factors,List,F#,Factors,我想创建一个数字的倍数列表。例如[2;4;6;8;10]是0到10之间2的倍数 我如何动态地创建这样一个x的倍数列表?有没有可能不设上限就这样做 一种方法是创建一个介于0和某个疯狂的大数字之间的列表,然后使用mod函数对其进行过滤。为了测试这一点,创建一个0到某个疯狂的大数字的列表会导致内存不足异常(等待大约30秒后) 我觉得F#有一些非常简单和很棒的方法来建立这样一个列表,但我是一个新手,还不知道它是什么。帮助?序列(IEnumerables)在这里提供您想要的惰性: let multiple

我想创建一个数字的倍数列表。例如[2;4;6;8;10]是0到10之间2的倍数

我如何动态地创建这样一个x的倍数列表?有没有可能不设上限就这样做

一种方法是创建一个介于0和某个疯狂的大数字之间的列表,然后使用mod函数对其进行过滤。为了测试这一点,创建一个0到某个疯狂的大数字的列表会导致内存不足异常(等待大约30秒后)

我觉得F#有一些非常简单和很棒的方法来建立这样一个列表,但我是一个新手,还不知道它是什么。帮助?

序列(IEnumerables)在这里提供您想要的惰性:

let multiplesOfN n =
    seq {
        for i in 1 .. 1000000 do
            yield i * n
    }

let first6multsof3 = 
    multiplesOfN 3 |> Seq.take 6

printfn "%A" (first6multsof3 |> Seq.toList)
或者使用您的过滤模式策略:

seq { 1 .. 1000000} |> Seq.filter (fun x -> x%3=0) |> Seq.take 6 |> Seq.toList 

这将产生一个无限的倍数序列:

let multiples n = Seq.unfold (fun i -> Some(i, i + n)) n

multiples 3 |> Seq.take 3 //seq [3; 6; 9]
这是更多的代码,但更快:

let multiples n =
  let rec loop i =
    seq {
      yield i
      yield! loop (i + n)
    }
  loop n
它基本上相当于下面的C#:

静态IEnumerable倍数(int n){
int i=n;
while(true){
收益率i;
i+=n;
}
}
您可以使用参数和
Seq.skip
来获取所需内容

例如,对于
[2;4;6;8;10]

List.init 6 ((*) 2)
|> List.tail
或:

[2..2..10]=>[2;4;6;8;10]

另一种方式

Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))

堆栈溢出。在这里,你提出了一个问题,并在片刻后得到了你想要的确切答案。+1。或
seq{2..2..10}
表示惰性序列。羞愧F#没有开放式范围表达式(如Haskell中的
[2,4..]
)int的范围,Limit max System.Int32.MaxValue:2147483647。展开时相同
List.init 6 ((*) 2)
|> List.tail
List.init 6 ((*) 2)
|> Seq.skip 1
|> List.ofSeq
[ firstValue..Step..endValue]
Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))