在创建类型提供程序之前,您能否运行代码?(F#)

3

说:

let x = // some operation
type t = SomeTypeProvider<x>

这个有效吗?


1
  1. 可以的。
  2. 你可能指的是 type t = SomeTypeProvider<x>
- s952163
谢谢,我已经纠正了那个错误。 - Lay González
我有点困惑,您面临的问题是什么?您可以在代码中的任何位置放置类型提供程序,例如在执行其他操作或定义其他类型之后。 - s952163
只要 x 是常量,是的,你可以这样做。 - CaringDev
@CaringDev 是的,在我的情况下,x 不是一个常量,而是一个 ssh 客户端创建。 - Lay González
2
让我阐明一下,因为你收到了各种回复,可能是因为问题太模糊,每个人都可以读取任何他们想要的内容。您可以在创建类型提供程序之前运行任何代码。当然,在创建之前无法访问类型提供程序内部的内容,但这应该是显而易见的。在您的情况下,您可以在实例化类型提供程序之前肯定创建一个ssh客户端。然后,您可以将参数指定为[<Literal>]。如果您的问题意味着可以动态指定连接字符串,则不行,并且下面的答案适用。 - s952163
1个回答

6

编号.

由于类型必须在编译时生成,类型提供程序的参数需要是一个常量。

换句话说,你标记为// some operation的代码可以计算为文字,但不能是可运行函数返回的值:

let arg = "foo"
type t = SomeTypeProvider<arg> // okay

let [<Literal>] arg = """{"name":"foo","value":42}"""
type t = SomeTypeProvider<arg> // okay

let arg = x.ToString()
type t = SomeTypeProvider<arg> // Boom! arg is not a Literal

这取决于您的应用程序,但最常见的情况之一如下:

您有一个与数据库相关的类型提供程序,并且需要在运行时从某种配置文件或其他地方检索连接字符串。因此,开发人员错误地认为他们需要一个可运行的代码来首先检索连接字符串,然后将其传递给类型提供程序。

正确的方法如下:

保留两个数据库:一个在常量位置本地存储(仅用于模式),另一个用于运行时目的。
将第一个(一个常量!)传递给您的类型提供程序。不要担心硬编码的路径;它仅用于模式检索。

// Use a fixed sample file for schema generation only
type MyCSVData = CsvProvider<"dummy.csv">

// Load the actual data at runtime
let data = MyCSVData.Load(RetrieveFileNameFromConfig())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接