F# 如何使用命令行参数作为类型提供程序的参数?

F# 如何使用命令行参数作为类型提供程序的参数?,f#,type-providers,F#,Type Providers,使用动态值作为类型提供程序(如CsvProvider)的参数的正确方法是什么?我希望这能奏效: open System.IO open FSharp.Data [<EntryPoint>] let main argv = type Stock = CsvProvider<argv.[0]> let stockData = Stock.Load(argv.[0]) for row in stockData.Rows do prin

使用动态值作为类型提供程序(如
CsvProvider
)的参数的正确方法是什么?我希望这能奏效:

open System.IO
open FSharp.Data

[<EntryPoint>]
let main argv =
    type Stock = CsvProvider<argv.[0]>
    let stockData = Stock.Load(argv.[0])

    for row in stockData.Rows do
        printfn "(%A, %A, %A, %A)" row.High row.Low row.Open row.Close

    0 //Exit
opensystem.IO
打开FSharp.Data
[]
让主argv=
存货类型=CsvProvider
让stockData=Stock.Load(argv[0])
用于stockData中的行。行执行
打印fn“(%A,%A,%A,%A)”行。高行。低行。开行。关闭
0//退出

我做错了什么?

不能将命令行参数用作类型提供程序的静态参数。行
type Stock=CsvProvider
要求
CsvProvider
参数为编译时常量,因为类型提供程序生成的类型是在编译时创建的,而不是在运行时创建的


您可以为
Load
函数提供不同的值,这可以是一个运行时值,就像在您的行
Stock.Load(argv.[0])
中一样,但您需要使用编译时常量文件名或与作为命令行参数传递的文件的预期布局相匹配的示例数据,因此,编译时生成的类型将与运行时传入的文件结构相匹配(即使数据可能不同)。

不能将命令行参数用作类型提供程序的静态参数。行
type Stock=CsvProvider
要求
CsvProvider
参数为编译时常量,因为类型提供程序生成的类型是在编译时创建的,而不是在运行时创建的


您可以为
Load
函数提供不同的值,这可以是一个运行时值,就像在您的行
Stock.Load(argv.[0])
中一样,但您需要使用编译时常量文件名或与作为命令行参数传递的文件的预期布局相匹配的示例数据,因此,编译时生成的类型将与运行时传入的文件的结构相匹配(即使数据可能不同)。

对于任何类型提供程序,您都需要一个模式,以便编译器能够理解数据的形状。因此,它必须是在编译时可用的东西。一种方法是将其放入文件中:

高、低、开、关
29.53,29.17,29.45,29.23
29.70,29.40,29.61,29.50
29.65,29.07,29.07,29.56
29.57,29.18,29.47,29.34
然后可以在
主功能的外部导入,如下所示:

//或您调用该文件的任何内容
存货类型=CsvProvider
CsvProvider还允许您仅内联为其提供一个架构(如果您愿意):

type Stock=CsvProvider
以下是整个计划的背景:

opensystem.IO
打开FSharp.Data
存货类型=CsvProvider
[]
让主argv=
让stockData=Stock.Load(argv[0])
用于stockData中的行。行执行
打印fn“(%A,%A,%A,%A)”行。高行。低行。开行。关闭
0

对于任何类型提供程序,您都需要一个模式,以便编译器能够理解数据的形状。因此,它必须是在编译时可用的东西。一种方法是将其放入文件中:

高、低、开、关
29.53,29.17,29.45,29.23
29.70,29.40,29.61,29.50
29.65,29.07,29.07,29.56
29.57,29.18,29.47,29.34
然后可以在
主功能的外部导入,如下所示:

//或您调用该文件的任何内容
存货类型=CsvProvider
CsvProvider还允许您仅内联为其提供一个架构(如果您愿意):

type Stock=CsvProvider
以下是整个计划的背景:

opensystem.IO
打开FSharp.Data
存货类型=CsvProvider
[]
让主argv=
让stockData=Stock.Load(argv[0])
用于stockData中的行。行执行
打印fn“(%A,%A,%A,%A)”行。高行。低行。开行。关闭
0

您的答案假设命令行参数是CSV数据行,而不是文件名。实际上,我希望相反,命令行参数是一个文件名,在这种情况下,
Load
是正确的。@AaronM.Eshbach很好,谢谢。特别是因为OP使用argv。[0]@downvoter为什么选择downvote?这是准确的,不是吗…?您的答案假设命令行参数是CSV数据行,而不是文件名。实际上,我希望相反,命令行参数是一个文件名,在这种情况下,
Load
是正确的。@AaronM.Eshbach很好,谢谢。特别是因为OP使用argv。[0]@downvoter为什么选择downvote?这是准确的,不是吗。。。?