f# - F# 中的类型提供程序和静态参数

标签 f# literals type-providers

我有一个库 Library_1,它可以正确编译并定义提供的类型:

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

当我将此库包含在另一个项目 Library_2 中时,编译器提示它无法在 Library_2 项目的根目录中找到任何“Brokernet.template.xls”。

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:我想这又是一个可以通过适当的分阶段编译解决的问题。

最佳答案

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

关于f# - F# 中的类型提供程序和静态参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11725326/

相关文章:

f# - 如何在函数内将静态参数传递给 f# 中的类型提供程序

f# - 我可以在 F# 中重新编程 op_Equals

c# - 使用 Walker 的别名方法进行加权随机选择

c# - F# 项目自动生成绑定(bind)重定向

c++ - 为什么文字在 C++ 中被视为表达式?

windows-8 - F# TypeProvider 可以在 Windows 应用商店应用程序中使用吗?

f# - 除F#以外,其他语言是否存在类型提供程序?

f# - 生成F#代码

javascript - 获取对象文字键的值

java - 获取数组类型的 Class 对象的最佳方法是什么?