如何测试 F# 中的序列是否无限



如果我有一个由递归函数生成的序列,如下所示:

let rec genConst t = seq { yield t ; yield! genConst (t) }
let inf = genConst 1

如何测试 INF 的长度是否无限大?

根本不可能。
F# 序列本质上是对 IEnumerable<'T> 同义词的包装器
IEnumerable<'T> (MSDN) 和 IEnumerator (MSDN) 都没有提供任何检索其长度的方法。

UPD感谢@svick的重要更正。

如果它对您的特定情况有帮助,您可以定义一个包装器类型来标记无限序列:

type InfiniteSeq<'T> = private Infinite of seq<'T> with
  interface seq<'T> with
    member x.GetEnumerator() = let (Infinite s) = x in s.GetEnumerator()
  interface System.Collections.IEnumerable with
    member x.GetEnumerator() = let (Infinite s) = x in s.GetEnumerator() :> _
module Seq =
  let infinite source = Infinite source
let rec genConst t = seq { yield t ; yield! genConst (t) } |> Seq.infinite
let firstFive = genConst 1 |> Seq.take 5

你会得到seq<_>的多态性,类型表示其他行为。

最新更新