2009-10-01 9 views
7

He estado agregando algunos métodos útiles a algunos de los módulos F # como List.Extendiendo el Módulo de lista F #

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 

y me pregunto si es posible agregar la mutación? Sé que la Lista es inmutable, entonces, ¿qué le parece agregar un método mutable a Ref de tipo Lista? Algo como esto.

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

o hay alguna manera de restringir un genérico para aceptar solo un mutable?

Respuesta

3

métodos de extensión genéricos están disponibles ahora en 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

Desafortunadamente, no parece posible agregar miembros de extensión a los tipos construidos cerrados (por ejemplo, Ref<int> o Seq<string>). Esto también se aplica al código que está tratando de usar, ya que está sustituyendo el tipo más específico 'a list por el parámetro genérico 'T del tipo abierto genérico Ref<'T>.