gpt4 book ai didi

.net - 不能将 try/与序列表达式内的 block 一起使用。如何绕过它?

转载 作者:行者123 更新时间:2023-12-04 23:22:03 24 4
gpt4 key购买 nike

考虑一下

Pentagonal numbers are generated by the formula, Pn=n(3n−1)/2.

我选择在 F# 中创建一个五边形数字序列:
let pentagonalSeq = { 1..Int32.MaxValue } |> Seq.map (fun n -> n*(3*n-1)/2)

到现在为止还挺好。大多数情况下,我只想计算几个小的整数五边形数。但有时我希望,例如,获得所有 Int32五边形数字。我想可以继续计算它们,直到我最终得到 OverflowException (我正在使用检查算术)。问题是 F# 对我的想法并不特别满意,大喊大叫
'try/with' cannot be used inside sequence expressions

让这位年轻女士满意的最佳方法是什么?

假设我想创建一个 int32_pentagonalSeq那:
  • 使用 pentagonalSeq
  • 不会导致任何额外的计算试图预测下一个项目是否可能导致溢出。

  • 谢谢

    最佳答案

    我认为 Gene 的答案可能是要走的路!但是如果你想使用序列表达式来迭代你已经拥有的序列的元素,你可以这样写:

    let takeWhileNonException (input:seq<_>) = seq { 
    use ps = input.GetEnumerator()
    while (try ps.MoveNext() with _ -> false) do
    yield ps.Current }

    可悲的是,你不能只是包装 for循环或 yield!声明 try .. with因为(如您所说),序列表达式不支持异常处理程序。但是,您可以使用底层迭代器并包装 MoveNext调用异常处理程序(因为这是一个普通表达式)并返回 false当操作第一次失败时。

    因此,要获取序列的最后一个数字,您现在可以编写:
    pentagonalSeq
    |> takeWhileNonException
    |> Seq.last

    关于.net - 不能将 try/与序列表达式内的 block 一起使用。如何绕过它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21767864/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com