在F#中我有以下代码
[<Literal>]
let fname=fstFile.FullName.ToString()
type genomeFile = CsvProvider<fname>
其中fstFile是FileInfo类的实例。但是,这失败了:
This is not a valid constant expression or custom attribute value
我似乎无法创建没有实际硬编码字符串的类型。有谁知道如何解决这个问题?
答案 0 :(得分:3)
CSV类型提供程序的参数需要是常量,以便可以在编译时生成类型(不实际评估程序。但是,您可以在运行时加载具有相同模式的不同文件。 / p>
因此,处理此问题的最佳方法是将一个实际输入复制到一个众所周知的位置(例如,与脚本位于同一目录中的sample.csv
),然后在运行时使用实际路径: / p>
// Generate type based on a statically known sample file
type GenomeFile = CsvProvider<"sample.csv">
// Load the data from the actual input at runtime
let actualData = GenomeFile.Load(fstFile.FullName.ToString())
答案 1 :(得分:2)
但是,如果您在已编译的DLL中引用文字,它将起作用。所以, 例如,如果您将示例拆分为两个项目,
e.g。使用TypeProviderArgs.fs ==&gt;创建一个新项目TypeProviderArgs.dll
module TypeProviderArgs
[<Literal>]
let fname=fstFile.FullName.ToString()
然后在程序中引用TypeProviderArgs.dll并且它应该可以正常工作
type genomeFile = CsvProvider<TypeProviderArgs.fname>
如果您必须为此目的创建一个库,这有点可怕, 但是如果你在一个已经拥有图书馆的大型项目中,那就不那么糟了。
答案 2 :(得分:1)
问题是[<Literal>]
只能应用于编译时已知的事情(例如"Hello"
)。
fstFile.FullName.ToString()
的结果仅在运行时才知道。
这种方法不起作用。