首页>Program>source

是否可以在文件中拆分F#模块?

根据我所拥有的书,但该书可能已过时 (F#的基础)

最新回答
  • 14天前
    1 #

    显然不是:

    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.
    

    更新:错误已在F#4.0中更改,现在为:

    威兹威兹

    其中

    error FS0248: Two modules named 'Module' occur in two parts of this assembly

    是程序集的完全限定名称,包括名称空间部分。

  • 14天前
    2 #

    类型扩展很酷,希望它们可以交叉文件,同时仍然是内在的.如果在同一文件中进行类型扩展,则该类型扩展将编译为一个类,并且该扩展可以访问私有成员,依此类推.如果您在另一个文件中执行此操作,则它只是一个"可选"扩展名,例如C#静态扩展名方法. (即使F#规范说的不同。)

    如果仅在获得设计师支持的情况下仍未解决此问题,我会感到惊讶.如果内在类型扩展名可以在程序集中的任何位置,那将非常漂亮。

    另一个选项(可能不是您想要的)是创建类型和模块,以相同的名称调用模块,然后向其添加ModuleSuffix标志:

    Module
    

    这是在F#库中使用的,因此它们可以具有类型List或任何类型,以及模块中包含大量的辅助功能。

  • 14天前
    3 #

    像Kurt一样,您可以向类型添加扩展方法 ,因此

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

    然后

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

    由于它是一个类而不是模块,因此您将失去执行" open Mine"的能力(但获得了重载的能力); 因此,根据您的实际操作,这可能对您而言是否可行。

  • 14天前
    4 #

    我有时将类型拆分到多个位置,例如:

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

    其中模块Foo和Bar位于不同的文件中。

  • 14天前
    5 #

    在我的一个项目中,目标是对 module Foo type Partial = Bar | BarInt of int module Bar type Foo.Partial with member x.Extend = 5 let b = Foo.Bar.Extend文件进行操作 和 Cp 分隔模块,但不需要用户为两个任务打开两个名称空间。

    Rm
    

    这是我的模块:

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

    和另一个:

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

  • Google Cloud Functions是否可以启用CORS?
  • jQuery onClick捕获元素的ID