OCaml中是否有中缀函数组合运算符?

tfb*_*boy 23 ocaml ocaml-batteries ocaml-core

只是一个简单的问题.我想知道在标准库(或在Jane Street的核心或电池中)中定义的OCaml中是否存在中缀函数组合运算符,就像Haskell中的(.)函数一样,它为我们节省了很多括号,因为我们可以编写(f . g . h) x而不是不太吸引人f (g (h x))).

谢谢大家.

Jef*_*eld 24

这里的答案与flip:-) 相同.OCaml标准库中未定义函数组合.在这种情况下,我不会偶尔想念它,我总是想念它.

OCaml中有电池项目使用操作定义函数组合(在你给的顺序)-|中的BatStd模块.正如lukstafi指出的那样(见下文),这个运营商显然将%在未来的电池发布中改变.(我在他们的源代码树中验证了这一点.)

据我所知,Jane Street Core项目没有定义函数组合运算符.它定义了一个函数composeFn的模块.

  • `@@`运算符不是函数组合.`@@`有这种类型:`('a - >'b) - >'a - >'b`.函数组合具有以下类型:`('a - >'b) - >('c - >'a) - >'c - >'b`.实际上@mookid提到了中缀组成是不鼓励的(这是我从未听说过的).对于它的价值,SML将函数组合作为中缀运算符`o`. (4认同)
  • 谢谢杰弗里。你太有帮助了。我目前也无法访问他们的文档。根据您的信息,我在 Jane Street 的 Core.Std.Fn 的源文件中发现了一个 `compose` 函数(参见 https://github.com/janestreet/core/blob/master/lib/fn.mli,第 31 行)。谢谢你。 (3认同)

Ele*_*fee 10

我只想补充一点,运算符很容易包含在F#中,它简单地定义为:

let (<<) f g x = f(g(x));;
Run Code Online (Sandbox Code Playgroud)

它具有类型签名:val ( << ) : f:('a -> 'b) -> g:('c -> 'a) -> x:'c -> 'b完全按照你的需要做...

(f << g << h) x = f(g(h(x))
Run Code Online (Sandbox Code Playgroud)

所以如果你不需要,你不需要电池项目

我想补充一点,它看起来像是<<你可能猜到的原因,因为>>运营商做了相反的事情:

let (>>) f g x = g(f(x));;

(f >> g >> h) x = h(g(f(x))
Run Code Online (Sandbox Code Playgroud)


Sta*_*tas 9

Fn.composeCore中有函数,但它不是中缀运算符.此外,它作为常规函数实现并具有运行时开销.

实际上,使用管道操作员非常方便.它没有直接在编译器中实现的运行时开销(从4.00开始).有关详细信息,请参阅优化管道操作员.

管道运算符在Core中以"|>"形式提供.因此,您可以将表达式重写如下:h x |> g |> f

  • 有些人认为Core的单管道运算符`|>`是一个不错的选择,因为它简化了你必须记住的中缀运算符的数量.理论上,你可以有函数组合和管道操作符,每个都是正向和反向,所以总共4个.但这真的有帮助吗?有些人认为它太过分了,而且更喜欢只有`|>`. (2认同)

moo*_*kid 8

似乎不鼓励使用中缀组合运算符.(见这个讨论).

你可以写f @@ g @@ h x而不是f (g (h x))).