Как правильно использовать трубу и карри в F #? - PullRequest
0 голосов
/ 21 сентября 2018

Я читаю о F # и пытаюсь применить его к своей повседневной работе.Я уже был в состоянии загрузить файл CSV с помощью FSharp.Data из NuGet, но я сделал это императивным стилем, я думаю.Сейчас я пытаюсь применить функциональные конструкции, пробовал следующее:

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, у которого curry уже есть текущий dir в качестве первого path, тогда объединенный результат дается CsvFile.Load.Я получил |> и неправильно вычеркнул?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Поскольку Path.Combine - это функция C #, которая принимает массив params, вы не можете передавать параметры в ненулевые позиции.Вы можете создать массив и передать его вместо:

[|Environment.CurrentDirectory; argv.[0]|]
|> Path.Combine
|> CsvFile.Load  
0 голосов
/ 21 сентября 2018

Ваш конвейер выглядит правильно, поэтому я подозреваю, что ваша проблема в том, что CsvFile.Load задокументировано для получения URI, а не имени файла .Чтобы проверить, правильно ли вы получаете имя файла, я сначала заменил бы CsvFile.Load на printfn "Got result: %s" в вашем конвейере, чтобы проверить, получаете ли вы ожидаемое имя файла.Тогда, если это то, что вы ожидаете (и я думаю, что это будет), вы можете добавить еще один шаг в конвейер:

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

    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 вместо имени файла, и все будет в порядке.

...