F# - Return 序列中的元素

F# - Return element from sequence

剧透警告!您将看到 projecteuler.net-问题 7 的解决方案。

很抱歉,如果这是重复的,但我在这里找不到问同样问题的问题。

我在一个函数中计算了一个数字序列,想要 return 第 n 个数字。

let isPrime x = 
    {2..x/2}
    |> Seq.exists (fun e -> x%e=0)
    |> not

let PrimeNumber nth = 
    let unfolder a =
        a
        |> Seq.unfold (fun e -> Some(e, e+1))
        |> Seq.find isPrime
        |> fun e -> Some(e, e)

    2
    |> Seq.unfold unfolder
    |> Seq.skip (nth-1) 
    |> Seq.head

let ans = PrimeNumber 10001

ans 永远是 2,但为什么?

当我用 nth=10001 计算 PrimeNumber 中的最后一个表达式时,正确的项目是 returned。我错过了什么吗?

问题出在你使用Seq.find。

Seq.find,从文档中,returns 第一个 条件为真的元素。在这种情况下,即 2。

因此,您的展开表达式将简单地生成一个无限的 2 序列,因此无论您采用什么元素,它始终是一个 2。

要查看此内容,运行 只需这段代码:

2
|> Seq.unfold unfolder

//output: val it : seq<int> = seq [2; 2; 2; 2; ...]

如果你需要坚持这个解决方案,你想要Seq.filter:

let isPrime x = 
{2..x/2}
|> Seq.exists (fun e -> x%e=0)
|> not

let PrimeNumber nth = 
    let unfolder a =
       a
       |> Seq.unfold (fun e -> Some(e, e+1))
       |> Seq.filter isPrime

    2
    |> unfolder
    |> Seq.skip (nth-1) 
    |> Seq.item 0

let ans = PrimeNumber 100会给你541 但正如评论中所回避的那样,其他更有效的解决方案。