2009-03-22 19 views
26

De acuerdo con this post, F # admite métodos de extensión en instancias de objetos y clases estáticas. Por ejemplo:Métodos de extensión estática en el módulo Seq

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

open ExtensionFSharp.CollectionExtensions 

Si escribo System.Linq.Enumerable., el método estático RangeChar aparece en la ventana de mi Intellisense.

Quiero agregar un método estático, for_alli, al módulo Seq. He modificado el siguiente código anterior de la siguiente manera:

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) 

Aunque ambos fragmentos de código tienen la misma estructura, SeqExtensions no compila. F # resalta la palabra Seq y devuelve el error "El tipo 'Seq' no está definido".

¿Cómo creo métodos de extensión estáticos en el módulo Seq?

Respuesta

43

Extender un F # módulo, basta con crear otro módulo con el mismo nombre:

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

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

Yo sabía que tenía que ser simple, gracias :) – Juliet

+0

Ver: [extensiones de tipos (F #)] (https://msdn.microsoft.com/en-us/library/dd233211.aspx) y observe la diferencia entre 'extensión intrínseca' y' extensión opcional'. –

Cuestiones relacionadas