繁体   English   中英

如何在F#中正确使用管道和curring?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM