您可以使用带有可选参数的函数在 OCaml 中进行流水线操作吗?

Can you use a function with optional arguments for pipelining in OCaml?

我试试这个(使用 Core):

    Some 9 
      |> Option.value_exn 
      |> printf "%d\n"

但是口译员说:

Line 2, characters 9-25:
Error: This expression has type
         ?here:Base__Source_code_position0.t ->
         ?error:Base.Error.t -> ?message:string -> 'a option -> 'a
       but an expression was expected of type int option -> 'b
这里的

"This expression"是指Option.value_exn.

是否无法使用像 value_exn 这样具有默认值的命名参数的函数,在单个非命名参数中进行流水线操作,而不手动指定所有命名参数?

诀窍是使用ppx_pipebang

这会将 f |> g 转换为 g (f) 并编译您的表达式。它还允许您在管道中使用构造函数,即使它们不是函数,例如

x |> Some

如果您要使用大量核心,我建议您使用所有 ppx_jane 来获得其他东西,例如各种 [@deriving ...] 转换,这些转换免费为您提供函子所需的许多功能在核心中。

如果您使用 dune 来构建您的项目(我相信这是现在新项目的标准),您可以将其添加到您的 dune 文件中(直接取自沙丘):

(executable
 (name hello_world)
 (libraries core)
 (preprocess (pps ppx_jane)))