用F#编写UNIX管道过滤器的惯用方式是什么?

时间:2019-01-26 18:06:40

标签: f#

在F#中,编写用于处理stdin中的行并写入stdout中的行的UNIX命令行工具的惯用方式是什么?我是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 :(得分:4)

您可能会得到很多答案,因为这实际上与个人风格有关,每个人都喜欢展示自己偏爱的做事方式:)这是我的两分钱:

  1. 别名长时间难看的外部API调用。
  2. 传递lambda时,折叠更长的“(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")