[英]How can I properly use pipe and currying in F#?
我正在阅读有关F#的文章,并试图将其应用于我的日常工作。 我已经能够借助NuGet的FSharp.Data
加载CSV文件,但是我认为它是一种命令式样式。 现在,我尝试应用功能构造,并尝试了以下方法:
open System
open System.IO
open FSharp.Data
[<EntryPoint>]
let main argv =
let data =
argv.[0]
|> Path.Combine Environment.CurrentDirectory
|> CsvFile.Load
printfn "%A" data.Headers
0
我在这里想念的是什么? 在我的脑海中argv.[0]
传递给Path.Combine Environment.CurrentDirectory
的结果,该结果已被咖喱治疗,已经将当前目录作为第一条path
然后将合并的结果提供给CsvFile.Load
。 我得到|>
并发错了吗?
由于Path.Combine
是采用params
数组的C#函数,因此无法将参数通过管道Path.Combine
到非零位置。 您可以创建一个数组并将其传递给它:
[|Environment.CurrentDirectory; argv.[0]|]
|> Path.Combine
|> CsvFile.Load
您的管道看起来正确,所以我怀疑您的问题是CsvFile.Load
被记录为采用URI而不是filename 。 为了检查您是否获得正确的文件名,我首先将在CsvFile.Load
中用printfn "Got result: %s"
替换CsvFile.Load
,以检查您是否正在获取期望的文件名。 然后,如果这是您期望的(我想会的),则可以在管道中添加另一步:
[<EntryPoint>]
let main argv =
let data =
argv.[0]
|> Path.Combine Environment.CurrentDirectory
|> sprintf "file://%s" // Convert filename to URI
|> CsvFile.Load
printfn "%A" data.Headers
0
由于您显然是F#的新手,因此我将稍微扩展这些步骤,以便您可以确认自己的直觉是正确的:
argv.[0]
|> Path.Combine Environment.CurrentDirectory
这就像调用Path.Combine Environment.CurrentDirectory argv.[0]
。
argv.[0]
|> Path.Combine Environment.CurrentDirectory
|> sprintf "file://%s" // Convert filename to URI
这就像将sprintf "file://%s" (Path.Combine Environment.CurrentDirectory argv.[0])
称为sprintf "file://%s" (Path.Combine Environment.CurrentDirectory argv.[0])
。
argv.[0]
|> Path.Combine Environment.CurrentDirectory
|> sprintf "file://%s" // Convert filename to URI
|> CsvFile.Load
这就像调用CsvFile.Load (sprintf "file://%s" (Path.Combine Environment.CurrentDirectory argv.[0]))
。
从您在问题中所说的来看,这似乎与您的理解相符,因为您正确地理解了管道。 因此,只需传递CsvFile.Load
URI而不是文件名,就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.