您可以使用带有可选参数的函数在 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)))
我试试这个(使用 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)))