2012-02-24 1 views
0

Я пытаюсь реализовать свойство ToEnumerable для внешнего типа, который его не реализует. Я не могу заставить код работать.Внедрение IEnumerable в Fsharp по внешнему типу

Итак, я отключил его до добавления нетипированного объекта GetEnumerator и добавил код для ToComparable для руководства. Однако я не знаю, как сохранить измененное состояние для счетчика.

Является ли pb анонимным классом?

Как вы это сделаете?

open System 
open System.Collections 
open System.Collections.Generic 

type Bloomberglp.Blpapi.Element with 
    //**WORKS OK** 
    member this.ToComparable:IComparer<Bloomberglp.Blpapi.Element> = { 
     new IComparer<Bloomberglp.Blpapi.Element> with 
      member this.Compare(x, y) = x.NumValues.CompareTo(y.NumValues) 
    } 

    //**WORKS (sort of) OK without storing the state** 
    member this.GetEnumerator2:IEnumerator = { 
     //let mutable i =0 
     new IEnumerator with 
       member this2.Reset() = 
       i <- 0; 
       () 
       member this2.MoveNext() = 
       if i < n then 
        i <- i + 1 
        true 
       else 
        false 
       member this2.Current 
       with get() = 
        this.GetElement(0) :> obj 
    } 

ответ

2

Предполагая NumValues является граф, вы могли бы сделать что-то вроде этого:

type Bloomberglp.Blpapi.Element with 
    member this.GetEnumerator() = 
    (Seq.init this.NumValues this.GetElement).GetEnumerator() 

Это возвращает IEnumerator<'T> где 'T тип возвращение GetElement.

+0

действительно. хорошо видно! Я только начинаю fsharp, так легко пропустить картину! – nicolas

+0

один меньше состояния для отслеживания ...;) – nicolas

1

Возвращаясь к исходной идее добавления ToEnumerable свойства типа, я мог бы назвать свойство AsEnumerable или AsSeq поскольку Seq является термином F # для IEnumerable, и осуществить это что-то вроде этого:

type Bloomberglp.Blpapi.Element with 
    member this.AsEnumerable = 
     seq { for i = 0 to this.NumValues - 1 do 
        yield this.GetElement(i) } 

Или вы можете сделать это с Seq.init, как предлагает Даниэль:

type Bloomberglp.Blpapi.Element with 
    member this.AsEnumerable = 
     Seq.init this.NumValues this.GetElement 
+0

очень хорошо. Я предполагаю, что второй является более функциональным, поскольку он (по-видимому) не вводит никакого нового изменяемого состояния для отслеживания. Я удивляюсь, как инкапсуляция изменчивого состояния приятна в использовании. – nicolas

 Смежные вопросы

  • Нет связанных вопросов^_^