Seq.generate не определен - это устарело? - PullRequest
1 голос
/ 01 апреля 2011

Я пытаюсь протестировать некоторый код F # из начальной книги F #, но получаю сообщение об ошибке «не определено» со ссылкой на «Seq.generate». (Я использую VS2010 - так что это, возможно, работало с более ранней версией VS / F #)

FWIW Я также установил F # Powerpack dll, но, похоже, это не имеет значения.

Есть ли обходной путь / альтернатива здесь?

/// execute a command using the Seq.generate
let execCommand (connName: string) (cmdString: string) =
    Seq.generate
        // This function gets called to open a connection and create a reader
        (fun () -> openConnectionReader connName cmdString)
        // This function gets called to read a single item in
        // the enumerable for a reader/connection pair
        (fun reader -> readOneRow(reader))
        (fun reader -> reader.Dispose())

Ответы [ 2 ]

4 голосов
/ 01 апреля 2011

Вы определенно можете использовать Seq.generate из F # PowerPack (либо ссылаясь на него, либо проще, просто скопировав его из источника). Я думаю, что функция была удалена, потому что теперь вы можете обрабатывать удаление объектов с помощью ключевого слова use.

Запись этого с использованием функции readOneRow потребует использования изменяемого состояния, но вы, вероятно, можете переписать его, используя что-то вроде этого:

/// execute a command using the Seq.generate
let execCommand (connName: string) (cmdString: string) =
  seq { use reader = openConnectionReader connName cmdString
        while reader.ReadNext() do 
            // Read some information from the reader (as done in 'readOneRow')
            let a = reader.GetInt32(0) // (e.g. ..or something like that)
            yield a  // generate next element of the sequence
      }

Ключевое слово use правильно выводит читателя, так что это делается автоматически для вас. Функция Seq.generate довольно хороша, но я думаю, что написание одной и той же вещи в явном виде, вероятно, в большинстве случаев более читабельно. (Особенно, если вы не используете readOneRow где-либо еще).

0 голосов
/ 01 апреля 2011

генерировать можно найти в FSharp.PowerPack.Совместимость: Compat.Seq.fs

...