为什么有些函数只能在 F# 脚本文件中使用,而不能在源文件中使用?

Why are some functions available only in F# script files, not in source files?

我已经注意到这几次了。违规函数的一个示例是 Array.take。在脚本文件中我可以写

[|1; 2; 4; 7; 6; 5|]
|> Array.take 3
|> Array.iter (printfn "%d")

这没有问题。但是,如果我尝试在实际源文件中使用 Array.take,则会出现以下错误

[|1; 2; 4; 7; 6; 5|]
|> Array.take 3 // RED SQUIGGLY ERROR HERE
|> Array.iter (printfn "%d")

错误信息是:

The value, constructor, namespace or type 'take' is not defined

那么,是什么原因呢?预先感谢您的帮助。

我怀疑您看到这是由于不同版本的 F#。在 F# 4.0 中尝试对许多 List SeqArray 函数进行正则化,请参阅:https://visualfsharp.codeplex.com/wikipage?title=Status

作为该过程的一部分添加的功能之一是 Array.take

在 F# interactive 中,毫无疑问你使用的是最新版本的 F#,但可能你不在你编译的项目中。

这可能是因为您没有更改项目设置中的版本,也可能是因为您的项目附加了一个 nuget 包,它通过 nuget 引用了特定版本的 F# Core。

如果您转到项目属性,您应该会看到一个 'Target F# Runtime' 设置,将其更改为 F# 4.0。如果我没记错的话,对特定 F# Core 版本的 nuget 引用将阻止您更改该设置,在这种情况下,您需要删除对 F# core 的引用并重新添加正确的版本作为列表中的引用大会。