F#中的 "导入 "相当于什么?

问题描述 投票:1回答:2

如何在F#中从另一个文件导入一个函数?像你这样做 import 在Python中。我试过 open, #using,什么都没用。我看了一下官方的文档,还是不知道怎么用。

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

// Log.fs

module Log = 
    let log = 
        printfn "Hello, World"
// Program.fs
open Log

module main = 
    [<EntryPoint>]
    let main argv =
        log // Not working
        0
.net visual-studio f# monodevelop
2个回答
1
投票

相当于 importopen.

如果我用你的pastebin代码,它 错漏百出,如SharpLab上所示。这里有几件事需要注意。

  1. F#喜欢它的代码是有序的 每个文件都被认为是一个独立的编译单元,你需要的任何东西只能在下一个文件中引用,而不是在前一个文件中引用。
  2. 在单个文件内部,你可以用以下方法创建循环引用。and但除此之外,同样适用:无论你想使用什么类型、值、模块,它都必须已经存在并且在范围内。
  3. 你创建的是一个日志值,而不是一个日志函数。
  4. 你忘记了 = 符号后 module 定义。

你的原始代码是这样的。

// 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"

这就出现了以下错误

错误 FS0039: 命名空间或模块 "日志 "没有定义。

你得到这个错误是因为你有一个 open Log但该模块 Log 还不存在。

错误 FS0010: 定义中结构化构造的意外开始。预期的'='或其他标记。

这是关于最后一个 let,必须缩进。

错误 FS0010: 在执行文件的这一点上或之前,结构体不完整。

同样的事情,由前面的错误引起。

在我改变了你的代码顺序,适当缩进后,将 let loglet log()并添加必要的 = 迹象。功夫不负有心人,试一试:

// 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

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


0
投票

这工作.当使用你的语法时,我得到一个错误(在VS 2017中)。Files in libraries or multiple-file applications must begin with a namespace or module declaration. When using a module declaration at the start of a file the '=' sign is not allowed. If this is a top-level module, consider removing the = to resolve this error.

// Log.fs

module Log

let log = 
    printfn "Hello, World"
© www.soinside.com 2019 - 2024. All rights reserved.