Каков идиоматический способ написания конвейерного фильтра UNIX в F #? - PullRequest
0 голосов
/ 26 января 2019

Каков идиоматический способ в F # для написания небольших инструментов командной строки UNIX, которые обрабатывают строки из stdin и записывают в stdout? Я новичок в F #, и собрал приведенный ниже шаблон из различных сообщений SO, который работает, но есть ли более элегантный / более идиоматический способ для этого последнего выражения?

#!/usr/bin/fsharpi --exec

let transform (line : string) =
    SOME_FUNCTION_OF line  // line transformation goes here

// is there a more idiomatic way of writing this:
Seq.initInfinite(fun _ -> System.Console.In.ReadLine())
    |> Seq.takeWhile(fun line -> line <> null)
    |> Seq.iter(fun x -> printfn  "%s" (transform x))

1 Ответ

0 голосов
/ 26 января 2019

Вы, вероятно, получите много ответов на этот вопрос, потому что это действительно личный стиль, и всем нравится показывать свой предпочтительный способ работы :) Вот мои два цента:

  1. Псевдоним, длинный, уродливыйвызовы внешнего API.
  2. При передаче лямбды сверните более длинный синтаксис "(fun x ->" (если это возможно, и если это не влияет на читабельность).
  3. Старайтесь избегать выполнениябольше, чем выполнение побочного эффекта в iter (). Выполнение сопоставления на отдельном шаге улучшает читабельность.

Итак,

let readLine = Console.In.ReadLine
let notEmpty = String.IsNullOrEmpty >> not

Seq.initInfinite (fun _ -> readLine())
|> Seq.takeWhile notEmpty
|> Seq.map transform
|> Seq.iter (printfn "%s")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...