F#中的导入与导入的等价物是什么 [英] What is the equivalent of "import" in F#
本文介绍了F#中的导入与导入的等价物是什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在F#中从另一个文件导入函数?就像您在Python中做的import
一样。我尝试了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
。
如果我使用您的粘贴板代码,它has a bunch of errors indeed,如SharpLab上所示。这里有几点需要注意:
- F#喜欢其有序的代码。每个文件都被视为单独的编译单元,从中需要的任何内容只能在后面的文件中引用,而不能在上一个文件中引用。
- 在单个文件中,您可以使用
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:未定义命名空间或模块‘Log’。
您得到此模块是因为您有open Log
,但模块Log
尚不存在。
错误FS0010:定义中的结构化构造意外开始。应为‘=’或其他标记。
这大约是最后let
,必须缩进。
错误FS0010:实现文件中此点或之前的结构化构造不完整
相同,由上一个错误引起。
更改代码顺序后,适当缩进,将let log
更改为let log()
,并添加必要的=
符号,it just works, try it out:
// 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
请注意,在模块中,您可以删除第一级缩进和<[2-6]-符号,但前提是它是该文件中的唯一模块,并且是项目中的最后一个文件(因此,通常我建议不要这样做,为了简单起见,只需始终缩进并始终在那里有=
-符号)。
但我只想向您展示一个同样有效的替代方案:
// 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
还请注意,如果将代码放在不同的文件中,则必须在文件的最顶部添加命名空间声明。通常,这将是整个项目的默认命名空间。
这篇关于F#中的导入与导入的等价物是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文