0

次のように、再帰関数によって生成されるシーケンスがある場合:

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

infの長さが無限大かどうかをテストするにはどうすればよいですか?

4

2 に答える 2

2

根本的に無理です。
F# シーケンスは、基本的に のシノニムに対するラッパーIEnumerable<'T>です。(MSDN)( MSDN) も、その長さを取得する手段を提供してい
ません。IEnumerable<'T> IEnumerator

UPD は、重要な修正をしてくれた @svick に感謝します。

于 2012-09-25T23:25:06.880 に答える
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<_>、タイプは追加の動作を示します。

于 2012-09-26T17:23:37.103 に答える