首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨F# .fsx文件共享类型

跨F# .fsx文件共享类型
EN

Stack Overflow用户
提问于 2014-06-18 12:04:32
回答 3查看 1.1K关注 0票数 14

有办法在fsx文件之间共享类型吗?

当使用#load从多个FSX文件加载包含类型的相同文件时,它们似乎每次都被前缀到不同的FS_00xx命名空间中,这意味着您不能传递它们。

有什么办法可以避免这种行为而不去编译成一个程序集呢?

EN

回答 3

Stack Overflow用户

发布于 2014-08-16 07:39:48

至于

http://msdn.microsoft.com/en-us/library/dd233169.aspx

.fsx文件用于在F#中包含非正式测试代码,而无需将测试代码添加到应用程序中,也无需为其创建单独的项目。默认情况下,即使脚本文件是项目的一部分,它们也不包含在项目的构建中。

这意味着,如果您有一个具有足够结构的项目存在这种依赖关系问题,则不应该使用.fsx文件,而应该使用.fs文件编写模块/命名空间。也就是说,您确实应该将它们类型编译成程序集。

f#交互式解释器为每个加载的文件生成程序集。如果您加载一个文件两次,则字节码会生成两次,而且即使它们具有相同的定义和名称,它们的类型也是不同的。这意味着您无法在两个.fsx文件之间共享类型,除非其中一个文件包含另一个文件。

当您使用与环境中已经存在的文件类型相同的#load文件时,f#交互式解释器可以使用两种不同的策略:

  1. 如果出现与现有名称冲突的情况,拒绝加载文件(抱怨某些内容已经定义)
  2. 将名称放在FS_00xx命名空间中(因此它们实际上与您已经加载的名称空间不同),最终对生成的名称空间进行open,这样就可以从交互式会话中获得名称。

由于fsx文件应该用作非正式测试,所以使用第二种方法更方便用户(使用第二种方法也有技术原因,主要依赖于.net VM类型系统,而且现有类型不能在运行时更改)。

票数 9
EN

Stack Overflow用户

发布于 2016-07-15 15:31:55

[备注:,这是对更具体的问题的一个更具体的回答,它是对这个答案的复制。]

我不认为有一个好的和容易的解决办法。我在一些项目(如F#片段网站)中使用的唯一解决方案是,只有一个顶级fsx文件加载大量fs文件。例如,请参见app.fsx

因此,您可以按如下方式从common.fsintMapper.fsstringMapper.fs中加载caller.fsx

代码语言:javascript
复制
#load "common.fs"
#load "stringMapper.fs"
#load "intMapper.fs"
open Common

stringMapper.fsintMapper.fs中,您不加载common.fs。通常的类型将由caller.fsx加载,所以一切都会正常进行。

唯一的问题是intMapper.fs现在不是一个独立的脚本文件,如果您想在编辑器中获得自动完成,您需要添加一个指定文件顺序的fsproj文件。在F#片段项目中,有项目档案,它指定编辑器应该查看和加载文件的顺序。

票数 9
EN

Stack Overflow用户

发布于 2015-05-29 15:56:13

将所有#load#open指令包含在实际从fsi.exe运行的文件中(下面的示例中为C),并确保加载的文件本身不#load它们自己的依赖关系:

文件A.fsx,B.fsx,C.fsx。B依赖于A C依赖于B和A。

乙含

代码语言:javascript
复制
//adding the code below would cause the types defined in A to be loaded twice
//#load "A.fsx"
//#open A

C包含

代码语言:javascript
复制
#load "A.fsx"
#open A
#load "B.fsx"
#open B

不幸的是,这使得所有文件很难从Visual编辑--编辑器不知道它们的依赖关系,并显示各种错误。

因此,这有点麻烦,推荐的方法似乎是拥有一个.fsx文件并将其他所有内容编译成一个.dll:

// file1.fsx #r "MyAssembly.dll“ https://msdn.microsoft.com/en-us/library/dd233175.aspx

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24285116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档