Расширение модуля F # List - PullRequest
       30

Расширение модуля F # List

7 голосов
/ 01 октября 2009

Я добавил несколько удобных методов для некоторых модулей F #, таких как List.

type Microsoft.FSharp.Collections.FSharpList<'a> with          //'
    static member iterWhile (f:'a -> bool) (ls:'a list) = 
        let rec iterLoop f ls = 
            match ls with
            | head :: tail -> if f head then iterLoop f tail
            | _ -> ()
        iterLoop f ls

и мне интересно, возможно ли добавить мутацию? Я знаю, что List является неизменным, так как насчет добавления изменяемого метода в Ref типа List. Как то так.

type Ref<'a when 'a :> Microsoft.FSharp.Collections.FSharpList<'a> > with //'
    member this.AppendMutate element =
        this := element :: !this

или есть какой-то способ ограничить универсальный тип только для принятия изменяемого?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2014

Общие методы расширения теперь доступны в F # 3.1:

open System.Runtime.CompilerServices

[<Extension>]
type Utils () =
    [<Extension>]
    static member inline AppendMutate(ref: Ref<List<'a>>, elt) = ref := elt :: !ref

let ls = ref [1..10]

ls.AppendMutate(11)

printfn "%A" ls
3 голосов
/ 01 октября 2009

К сожалению, невозможно добавить элементы расширения к закрытым составным типам (например, Ref<int> или Seq<string>). Это также относится к коду, который вы пытаетесь использовать, поскольку вы заменяете более конкретный тип 'a list для универсального параметра 'T открытого универсального типа Ref<'T>.

...