F#中的导入与导入的等价物是什么 [英] What is the equivalent of "import" in F#

查看:0
本文介绍了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

推荐答案

等效于importopen

如果我使用您的粘贴板代码,它has a bunch of errors indeed,如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:未定义命名空间或模块‘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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆