在创建类型提供程序之前是否可以运行代码?(F#)

在创建类型提供程序之前是否可以运行代码?(F#),f#,type-providers,F#,Type Providers,说: 让x=//一些操作 type t=SomeTypeProvider 这有效吗?否 由于类型必须在编译时生成,因此类型提供程序的参数必须是常量 换句话说,您标记的代码//某些操作可以计算为文本,但不能是可运行函数返回的值: let x = // some operation type t = SomeTypeProvider<x> let arg=“foo” type t=SomeTypeProvider//好的 let[]arg=“{”name:“foo”,“value”:

说:

让x=//一些操作
type t=SomeTypeProvider
这有效吗?

由于类型必须在编译时生成,因此类型提供程序的参数必须是常量

换句话说,您标记的代码//某些操作可以计算为文本,但不能是可运行函数返回的值:

let x = // some operation
type t = SomeTypeProvider<x>
let arg=“foo”
type t=SomeTypeProvider//好的
let[]arg=“{”name:“foo”,“value”:42}”
type t=SomeTypeProvider//好的
设arg=x.ToString()
type t=SomeTypeProvider//Boom!arg不是一个文本

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

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

正确的方法如下:

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

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
//仅将固定示例文件用于模式生成
类型MyCSVData=CsvProvider
//在运行时加载实际数据
让data=MyCSVData.Load(RetrieveFileNameFromConfig())

1。是的,你可以。2.你的意思可能是
typet=SomeTypeProvider
。谢谢,我已经纠正了这个错误。不过我有点困惑,你到底面临什么问题?您可以在代码中的任何位置放置类型提供程序,例如,在执行一些不相关的操作或定义一些其他类型之后。只要
x
是常量,您就可以。请允许我澄清这一点,因为您得到了各种各样的答复,可能是因为这个问题对于每个人来说都非常模糊,无法理解他们想要的任何内容。在创建类型提供程序之前,可以运行任何代码。当然,您不能在创建之前访问类型提供程序中的内容,但这应该是显而易见的。在您的情况下,您当然可以在实例化类型提供程序之前创建ssh客户机。然后,您可以将参数指定为[]。如果您的问题的意思是,您可以动态地指定连接字符串,然后是否,下面的答案适用。
// 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())