如何在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
相当于 import
是 open
.
如果我用你的pastebin代码,它 错漏百出,如SharpLab上所示。这里有几件事需要注意。
and
但除此之外,同样适用:无论你想使用什么类型、值、模块,它都必须已经存在并且在范围内。=
符号后 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 log
到 let 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
还要注意的是,如果你把代码放在不同的文件中,你必须在文件的顶部添加一个命名空间声明。通常这将是整个项目的默认命名空间。
这工作.当使用你的语法时,我得到一个错误(在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"