Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#:向下播放序列至IEnumerator_F#_Ienumerator_Seq - Fatal编程技术网

F#:向下播放序列至IEnumerator

F#:向下播放序列至IEnumerator,f#,ienumerator,seq,F#,Ienumerator,Seq,为什么在F#中,我可以这样做 let s = seq { for i in 0 .. 4095 do yield i } :?> IEnumerator 。。。但这会抛出一个系统。InvalidCastException let s = Seq.init 4095 (fun i -> i) :?> IEnumerator 序列表达式创建一个实现IEnumerable和IEnumerator 您可以重构代码以使用IEnumerable而不是IEnumerator,因为这两种构

为什么在F#中,我可以这样做

let s = seq { for i in 0 .. 4095 do yield i } :?> IEnumerator
。。。但这会抛出一个
系统。InvalidCastException

let s = Seq.init 4095 (fun i -> i) :?> IEnumerator

序列表达式创建一个实现
IEnumerable
IEnumerator

您可以重构代码以使用
IEnumerable
而不是
IEnumerator
,因为这两种构造都会生成
IEnumerable

或者,如果您确实需要一个
IEnumerator
,只需调用
GetEnumerator
,即可从
可枚举对象返回
枚举器

let s = (Seq.init 4095 (fun i -> i)).GetEnumerator()
printfn "%b" (s :? IEnumerable<int>) // false
printfn "%b" (s :? IEnumerator<int>) // true
let s=(Seq.init 4095(fun i->i)).GetEnumerator()
printfn“%b”(s:?IEnumerable)//false
printfn“%b”(s:?IEnumerator)//true
如果查看,序列表达式将转换为:

Seq.collect (fun pat -> Seq.singleton(pat)) (0 .. 4095)
如果您查看源代码以了解
Seq.collect
的定义,它是:

let collect f sources = map f sources |> concat
let concat sources = 
            checkNonNull "sources" sources
            mkConcatSeq sources
如果你看一下
concat
的定义,它是:

let collect f sources = map f sources |> concat
let concat sources = 
            checkNonNull "sources" sources
            mkConcatSeq sources
mkConcatSeq
定义为:

let mkConcatSeq (sources: seq<'U :> seq<'T>>) = 
            mkSeq (fun () -> new ConcatEnumerator<_,_>(sources) :> IEnumerator<'T>)
let init count f =
            if count < 0 then invalidArg "count" (SR.GetString(SR.inputMustBeNonNegative))
            mkSeq (fun () -> IEnumerator.upto (Some (count-1)) f)
let mkSeq f = 
            { new IEnumerable<'U> with 
                member x.GetEnumerator() = f()
              interface IEnumerable with 
                member x.GetEnumerator() = (f() :> IEnumerator) }
mkSeq
定义为:

let mkConcatSeq (sources: seq<'U :> seq<'T>>) = 
            mkSeq (fun () -> new ConcatEnumerator<_,_>(sources) :> IEnumerator<'T>)
let init count f =
            if count < 0 then invalidArg "count" (SR.GetString(SR.inputMustBeNonNegative))
            mkSeq (fun () -> IEnumerator.upto (Some (count-1)) f)
let mkSeq f = 
            { new IEnumerable<'U> with 
                member x.GetEnumerator() = f()
              interface IEnumerable with 
                member x.GetEnumerator() = (f() :> IEnumerator) }
让mkSeq f=

{new IEnumerable
而不是
IEnumerator

你确定你不想要IEnumerable而不是IEnumerator吗?我正在为Unity编写一个协同程序。必须是IEnumerable。Dang,偷了我的答案。嗯,部分原因是…不知道序列表达式产生的结果与Seq模块对应的结果不完全相同。