类提供商和静态参数在F#(Type provider and static argument in

2019-09-20 11:23发布

我有一个库,Library_1,其正确编译,并限定了提供类型:

type modelforexcel =  FSharpx.ExcelFile<@"template.xls", "Brokernet", true>

当我包括另一个项目这个库,Library_2,编译器抱怨说,它无法找到任何“Brokernet.template.xls”,在新的 Library_2项目的根。

Error   4   'C:\Library_2\template.xls' could not be found. Check the spelling of the file name, and verify that the file location is correct.

我想指的是原来的“Brokernet.template.xls”的类型,所以我想提供给它的完整路径,但

type modelforexcel =  
   FSharpx.ExcelFile<__SOURCE_DIRECTORY__+@"Brokernet.template.xls", "Brokernet", true>

不工作,我想这不是一个文字(?),但“很明显”定义这个字面也不管用

[<Literal>]
let a = __SOURCE_DIRECTORY__+@"Brokernet.template.xls"

是否有任何的方式来定义这样的“动态文字”?

编辑

有趣的是,如果我定义中的第一个库我的一个模块内的类型

module Load =
   [<Literal>]
   let a = @"Brokernet.template.xls"
   type modelforexcel =  FSharpx.ExcelFile< a , "Brokernet", true>

然后,类型不是“再生”当在第二个使用第一库,并且类型提供者不抱怨文件缺席的第二库的根的。

这揭示在F#这可能是最好的主人暴露的编译模型深刻的见解。 我只是说,作为一个粗野的男人,说:“代码模块”

PS:我想这就是这将通过适当的上演汇编来解决一个更的问题。

Answer 1:

正如被显示在评论,使用相对路径例如@"..\Library_1\Brokernet.template.xls"解决了这个问题。



文章来源: Type provider and static argument in F#