如何在F#中测试序列是否为无限?

时间:2012-09-25 22:57:17

标签: f#

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

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

如何测试inf的长度是否无穷大?

2 个答案:

答案 0 :(得分:2)

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

UPD感谢@svick进行了一次重要修正。

答案 1 :(得分:1)

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

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<_>的多态性,类型表示其他行为。