Методы статического расширения в модуле Seq - PullRequest
27 голосов
/ 22 марта 2009

Согласно этой записи , F # поддерживает методы расширения для экземпляров объектов и статических классов. Например:

module CollectionExtensions = 
    type System.Linq.Enumerable with   
        static member RangeChar(first:char, last:char) = {first .. last}

open ExtensionFSharp.CollectionExtensions 

Если я наберу System.Linq.Enumerable., в моем окне Intellisense появится статический метод RangeChar.

Я хочу добавить статический метод for_alli в модуль Seq. Я изменил следующий код выше следующим образом:

module SeqExtensions =
    type Microsoft.FSharp.Collections.Seq with   (* error on this line *)
        static member for_alli f l =
            l
            |> Seq.mapi (fun i x -> i, x)
            |> Seq.for_all (fun (i, x) -> f i x)

Хотя оба фрагмента кода имеют одинаковую структуру, SeqExtensions не компилируется. F # выделяет слово Seq и возвращает ошибку «Тип« Seq »не определен».

Как создать методы статического расширения в модуле Seq?

1 Ответ

46 голосов
/ 22 марта 2009

Чтобы расширить модуль F # , просто создайте другой модуль с тем же именем:

module Seq =
    let myMap f s = seq { for x in s do yield f x }

Seq. // see your stuff here alongside normal stuff
...