// http://stackoverflow.com/questions/9272285/f-is-there-a-way-to-extend-the-monad-keyword-list let p = seq { for i in 1 .. 4 do yield (i + 100) } p.Dump("p") (* let q = seq { for i in 1 .. 10 do select (i + 100) reverse } q.Dump("q") *) type MySeqBuilder() = // Standard definition for 'for' and 'yield' in sequences member x.For (source : seq<'T>, body : 'T -> seq<'R>) = seq { for v in source do yield! body v } member x.Yield item = seq { yield item } // Define an operation 'select' that performs projection [] member x.Select (source : seq<'T>, [] f: 'T -> 'R) : seq<'R> = Seq.map f source // Defines an operation 'reverse' that reverses the sequence (several versions) [] member x.ReverseEnglish (source : seq<'T>) = List.ofSeq source |> List.rev [] member x.ReverseRussian (source : seq<'T>) = List.ofSeq source |> List.rev [] // fǎn zhuǎn member x.ReverseChinese (source : seq<'T>) = List.ofSeq source |> List.rev let myseq = MySeqBuilder() let r = myseq { for i in 1 .. 4 do select (i + 100) reverse реверсировать 反转 } r.Dump("r") //