繁体   English   中英

跨F#.fsx文件共享类型

[英]Sharing types across F# .fsx files

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

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

有没有解决此问题的方法,而不必诉诸于汇编?

至于

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类型系统,以及现有的类型不能在运行时更改)。

[ 注意:这是对特定问题的更具体答案,该问题是该问题的重复。]

我认为没有一个很好且简单的解决方案。 我在某些项目(例如F#代码段网站 )中一直使用的一种解决方案是,只有一个顶级fsx文件可以加载多个fs文件。 例如,请参阅app.fsx

因此,您将具有从caller.fsx加载的common.fsintMapper.fsstringMapper.fs ,如下所示:

#load "common.fs"
#load "stringMapper.fs"
#load "intMapper.fs"
open Common

stringMapper.fsintMapper.fs内部,您不会加载common.fs 常见类型将在之前由caller.fsx加载,因此一切正常。

唯一的问题是intMapper.fs现在不是独立的脚本文件-如果要在编辑器中自动完成,则需要添加一个fsproj文件来指定文件顺序。 在F#代码段项目中,有一个项目文件 ,指定编辑器应查看并加载文件的顺序。

在实际上从fsi.exe运行的文件中拥有所有#load#open指令(在下面的示例中为C),并确保加载的文件本身不会#load自己的依赖项:

文件A.fsx,B.fsx,C.fsx。 B取决于A。C取决于B和A。

B包含

//adding the code below would cause the types defined in A to be loaded twice
//#load "A.fsx"
//#open A

C包含

#load "A.fsx"
#open A
#load "B.fsx"
#open B

不幸的是,这使得所有文件都难以从Visual Studio中进行编辑-编辑器不知道它们的依赖性,并显示各种错误。

因此,这有点麻烦,建议的方法似乎是使用一个.fsx文件,然后将其他所有文件编译成.dll:

 // file1.fsx #r "MyAssembly.dll" 

https://msdn.microsoft.com/zh-CN/library/dd233175.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM