相当于import
is open
.
如果我拿走你的pastebin代码,它确实有很多错误 https://sharplab.io/#v2:EYLgdgpgLgZgHgGgDYhgZwD4HosAIAKATgPYDmhAhgLYB06AsAFBXEAmArkhLlRQJZgmxAA4QwuADJkmuJgG0APAFEwUQgE98xAVAB8AXSZcoPfuIqFSAN1wBeGbkfDCOmOIBEACQhIkxdw6OfqSBuAAMuDi4hNDshObiOhCkEIS4EHB8JgDGbBAyBYxRUqR0aEwsHFyS0oyyjMa4wXahzq4e3r7+QA=,如 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
to let log()
,并添加必要的=
signs, 它确实有效,尝试一下 https://sharplab.io/#v2:EYLgdgpgLgZgHgGgDYhgZwD4HosAIAyA9gOYB06AsAFAC2hAJgK5IQEm4C81uPuLUfEgAoAlJ269JABwBOASzCwwuAEQAJCEiSEV1ajlwAFGSRkBDGuTTU6TFrhpmFnXBJ6EpEZUWJ6qkgG0AHgBRRRkAT0NCBSgAPgBdNz5oBydlMxliADdxf0leWViYZXVNbV18gsFiUWTJAAZcAxloRhkM5ViIYggZXAg4OQEAYwYIbkmqIA=:
// 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
请注意,在模块内部,您可以删除第一级缩进和=
-sign,但前提是它是该文件中的唯一模块并且是项目中的最后一个文件(所以一般来说我建议不要这样做,为了保持简单,总是缩进并始终具有=
-在那里签名)。
但只是为了向您展示一种也有效的替代方案:
// 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
另请注意,如果将代码放置在不同的文件中,则必须在文件的最顶部添加命名空间声明。通常,这将是整个项目的默认命名空间。