visual studio microsoft español disponibilidad descargar community comandos clusvcadm cluster alta .net f# module

.net - español - microsoft visual studio descargar



Dividir módulos F#en varios archivos (5)

A veces divido un tipo en varios lugares, como este:

module Foo type Partial = Bar | BarInt of int module Bar type Foo.Partial with member x.Extend = 5 let b = Foo.Bar.Extend

Donde los módulos Foo y Bar están en diferentes archivos.

¿Es posible dividir un módulo F # entre archivos?

Según el libro que tengo, es probable que el libro esté obsoleto (Fundamentos de F #)


Aparentemente no:

C:/temp/Tim>type 1.fs 2.fs 1.fs #light module Module let sayHello1 = printfn "Hello, " 2.fs #light module Module let sayHello2 = printfn "world!" C:/temp/Tim>fsc 1.fs 2.fs Microsoft F# Compiler, (c) Microsoft Corporation, All Rights Reserved F# Version 1.9.6.2, compiling for .NET Framework Version v2.0.50727 2.fs(2,1): error FS0191: An implementation of the file or module Module has already been given.

Actualización: el error ha cambiado en F # 4.0, ahora es:

error FS0248: Dos módulos llamados ''Módulo'' ocurren en dos partes de este ensamblaje

donde Module es el nombre completo de su ensamblaje, incluida la parte del espacio de nombres.


Como dice Kurt, puedes agregar métodos de extensión a los tipos, y así

// File1.fs namespace Foo type Mine() = static member f1 () = ()

entonces

// File2.fs type Foo.Mine with static member f2() = () Foo.Mine. // both f1 and f2 here

Ya que es una clase y no un módulo, pierdes la habilidad de hacer ''abrir Mine'' (pero obtienes la habilidad de sobrecargar); por lo tanto, esta puede o no ser una alternativa aceptable para usted dependiendo de lo que esté haciendo exactamente.


En uno de mis proyectos, el objetivo era archivar las operaciones Cp y Rm en módulos separados, pero no es necesario que el usuario abra dos espacios de nombres para ambas tareas.

open Xake.FileTasks ... do! Cp "*/*.exe" "deploy/*.exe" do! Rm "*/*.exe"

Aquí están mis módulos:

namespace Xake.FileTasks [<AutoOpen>] module RmImpl = let Rm filemask target = ...

y el otro:

namespace Xake.FileTasks [<AutoOpen>] module CpImpl = let Cp filemask target = ...


Las extensiones de tipo son geniales y, con suerte, permitirán que se realicen archivos cruzados, a la vez que siguen siendo intrínsecas . Si hace una extensión de tipo en el mismo archivo, se compila en una clase, y la extensión tiene acceso a miembros privados y así sucesivamente. Si lo haces en otro archivo, es solo una extensión "opcional", como los métodos de extensión estática C #. (A pesar de que las especificaciones F # dicen de manera diferente.)

Me sorprendería si esto no se aborda en algún momento, aunque solo sea por el apoyo del diseñador. Si las extensiones de tipo intrínseco pudieran estar en cualquier parte del ensamblaje, eso sería bastante elegante.

Otra opción, que podría no ser lo que desea, es crear un tipo y un módulo, llamar al módulo con el mismo nombre y luego agregarle el indicador ModuleSuffix:

type Foo() = static member Bar = 1 [<CompilationRepresentationAttribute(CompilationRepresentationFlags.ModuleSuffix)>] module Foo = let Baz = 2 printfn "%d %d" Foo.Bar Foo.Baz

Esto se usa en las bibliotecas F #, para que puedan tener una lista de tipos o lo que sea, junto con toneladas de material auxiliar en un módulo.