Extending F# List Module

extension-methods, f#, list, module

Solution

Generic extension methods are now available in 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

Problem

I've been adding a few handy methods to some of the F# modules such as 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 ``` and i'm wondering if it's possible to add mutation? I know List is immutable so how about adding a mutable method to Ref of type List. Something like this. ``` type Ref<'a when 'a :> Microsoft.FSharp.Collections.FSharpList<'a> > with //' member this.AppendMutate element = this := element :: !this ``` or is there some way to constrain a generic to only accept a mutable?

Original source