.net “的等价物是什么?”;进口;在F#

.net “的等价物是什么?”;进口;在F#,.net,visual-studio,f#,monodevelop,.net,Visual Studio,F#,Monodevelop,如何从F#中的另一个文件导入函数?就像在Python中导入一样。我试着打开,#用,什么都不管用。我看了官方文件,仍然不知道如何使用它 基本上,我想要这样的东西: // Log.fs module Log = let log = printfn "Hello, World" //Program.fs 原木 主模块= [] 让主argv= 日志//不工作 0 这是有效的。在库或多个文件应用程序中使用语法文件必须以名称空间或模块声明开头时,我遇到一个错误(在VS 201

如何从F#中的另一个文件导入函数?就像在Python中导入
一样。我试着打开
#用
,什么都不管用。我看了官方文件,仍然不知道如何使用它

基本上,我想要这样的东西:

// Log.fs

module Log = 
    let log = 
        printfn "Hello, World"
//Program.fs
原木
主模块=
[]
让主argv=
日志//不工作
0
这是有效的。在库或多个文件应用程序中使用语法
文件必须以名称空间或模块声明开头时,我遇到一个错误(在VS 2017中)。在文件开头使用模块声明时,不允许使用“=”符号。如果这是一个顶层模块,考虑移除=来解决这个错误。< /代码> < /P>
// Log.fs

module Log

let log = 
    printfn "Hello, World"

导入
等效的是
打开

如果我拿走了你的pastebin代码,它会显示在SharpLab上。这里有几点需要注意:

  • F#喜欢它的代码有序。每个文件都被视为一个独立的编译单元,您需要的任何内容都只能在下面的文件中引用,而不能在前面的文件中引用
  • 在单个文件中,可以使用
    创建循环引用,但在其他情况下,同样适用:无论要使用什么类型、值、模块,它都必须已经存在并在范围内
  • 您创建的是日志值,而不是日志函数
  • 您忘记了
    模块
    定义后的
    =
    符号
  • 您的原始代码如下:

    // Program.fs
    module main
    open Log
    
    [<EntryPoint>]
    let main argv =
        printfn "Hello"
        log
        0 // return an integer exit code
    
    
    // Log.fs
    module Log
    
    let log =
        printfn "Hello"
    
    请注意,在模块内部,您可以删除第一级缩进和
    =
    -符号,但前提是它是该文件中的唯一模块,并且是项目中的最后一个文件(因此,为了保持简单,通常我建议不要这样做,只需始终缩进并始终在那里有
    =
    -符号)

    但我只是想告诉你一个同样有效的替代方案:

    // Log.fs
    module Log =
        let log() =
            printfn "Hello"
    
    open Log
    
    [<EntryPoint>]
    let main argv =         // it is the last in the file or prj, this is allowed
        printfn "Hello"
        log()
        0 // return an integer exit code
    
    //Log.fs
    模块日志=
    让我们记录一下()=
    printfn“你好”
    原木
    []
    让main argv=//它是文件或prj中的最后一个,这是允许的
    printfn“你好”
    日志()
    0//返回整数退出代码
    

    还要注意,如果将代码放在不同的文件中,则必须在文件的最顶端添加名称空间声明。通常,这将是整个项目的默认名称空间。

    和docs@JackHughes我看了一下,没法让它工作。也许我看错了。你能举个例子吗?谢谢这里是我提供的文档中的示例。也许在你的问题中给出你正在处理的代码会更有效率,然后我们可以找出如何做你想做的事情?使用
    open
    和名称空间或模块的全名,no
    结尾,如
    开放式系统.集合
    。该语句位于名称空间声明之后,但位于其他任何内容之前。如果在模块内部使用(在
    模块=…
    之后),它必须像其他任何东西一样缩进。如果不起作用,请显示不起作用的代码。这是编译器错误。确切地说,名称空间或模块日志没有定义,对我来说没有。我检查了这么多次,它还是不起作用。这是我的代码:。顺便说一句,我使用的是Monodevelop,如果它重要的话,我想知道这是否是某种奇怪的构建顺序问题?我不熟悉Monodevelop,所以恐怕我帮不了你。我在VS 2017上编译了代码,它没有任何问题,因此您的工具一定有点奇怪。@stfn在您的粘贴箱中,
    main
    函数不在底部,而您的
    Log
    模块在主模块之后。F#需要正确的顺序,在使用之前必须定义您使用的内容。只需将
    日志
    放在顶部,其余部分放在底部,就可以了。这是一个很好的资源:
    // Log.fs
    module Log =
        let log() =
            printfn "Hello"
    
    // Program.fs
    module main = 
        open Log
    
        [<EntryPoint>]
        let main argv =
            printfn "Hello"
            log()
            0 // return an integer exit code
    
    // Log.fs
    module Log =
        let log() =
            printfn "Hello"
    
    open Log
    
    [<EntryPoint>]
    let main argv =         // it is the last in the file or prj, this is allowed
        printfn "Hello"
        log()
        0 // return an integer exit code