【问题标题】:F# sequences with BigInteger indices具有 BigInteger 索引的 F# 序列
【发布时间】:2021-08-10 20:48:45
【问题描述】:

我正在寻找一种类似于 F# 中的序列的类型,其中索引可以是大整数,而不是仅限于 int。有没有这样的东西? 我所说的“大整数索引”是指一种允许与之等效的类型:

let s = Seq.initInfinite (fun i -> i + 10I)

【问题讨论】:

  • 为什么需要这么大的索引?仅当数字超过 System.Int64.MaxValue 时才使用大整数。如果您使用int64 作为索引,那么您最多可以索引9007199254740991 个元素。如果这是字节,那么您将能够使用 8_388_607 TBytes - 多达 800 万个普通笔记本。你不需要这个

标签: f#


【解决方案1】:

以下将生成无限系列的 bigint:

let s = Seq.initInfinite (fun i -> bigint i + 10I)

我怀疑你真正想要的是Map<'Key, 'Value>

这让您可以有效地使用 bigint 作为索引来查找您关心的任何值:

let map = 
    seq {
        1I, "one"
        2I, "two"
        3I, "three"
    }
    |> Map.ofSeq

// val map : Map<System.Numerics.BigInteger,string> =
//   map [(1, "one"); (2, "two"); (3, "three")]

map.TryFind 1I |> (printfn "%A") // Some "one"
map.TryFind 4I |> (printfn "%A") // None

【讨论】:

    【解决方案2】:

    initInfinite 的等价于 BigIntegers 将是

    let inf = Seq.unfold (fun i -> let n = i + bigint.One in Some(n, n)) bigint.Zero
    let biggerThanAnInt = inf |> Seq.skip (Int32.MaxValue) |> Seq.head // 2147483648
    

    在我的机器上运行大约需要 2 分钟。

    但是,我怀疑这是否有任何实际用途 :-) 那是除非您从某个已知值开始 > Int32.MaxValue 并很快停止(生成少于 Int32.MaxValue 的项目),然后可以通过抵消来解决BigInt 索引到 Int32 域中。

    理论上,您可以修改 Seq 模块,使用与 BigIntegers 一起使用的函数来跳过 / 窗口 / ... 项目数量 > Int32.MaxValue(例如,通过重复执行相应的 Int32 变体)

    【讨论】:

      【解决方案3】:

      由于您想要索引到一个序列中,我假设您想要一个以BigInteger 作为索引的Seq.item 版本。 F# 中没有类似的东西,但很容易定义自己的:

      open System.Numerics
      
      module Seq =
          let itemI (index : BigInteger) source =
              source |> Seq.item (int index)
      

      请注意,除非您计划创建超过 2,147,483,647 个项目的序列,否则不需要新类型,这可能无论如何都不实用。

      用法:

      let items = [| "moo"; "baa"; "oink" |]
      
      items
          |> Seq.itemI 2I
          |> printfn "%A"   // output: "oink"
      

      【讨论】:

      • 实际上我需要的正是在大于int 上限的索引处生成序列。我将编辑问题以澄清这一点。
      • F# 序列是惰性的,这意味着您必须评估所有前面的值才能得到您想要的值。听起来你真的想要一个支持 O(1) 索引的数组?
      • 数组索引可以是大整数吗?
      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2023-03-15
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多