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

OCaml中是否有中缀函数合成运算符?,ocaml,ocaml-batteries,ocaml-core,Ocaml,Ocaml Batteries,Ocaml Core,只是一个简单的问题。我想知道在标准库(或Jane Street的Core或Batters)中定义的OCaml中是否有中缀函数组合运算符,比如Haskell中的(.)函数,它为我们节省了很多括号,因为我们可以编写(f.g.h)x,而不是不太吸引人的f(g(hx)) 谢谢各位。这里的答案与翻转的答案相同。OCaml标准库中未定义函数组合。在这种情况下,这不是我偶尔错过的东西,我总是错过它 项目使用模块中的运算符-|定义函数组合(按照您给出的顺序)。正如lukstafi指出的(见下文),在未来的电池版

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


谢谢各位。

这里的答案与
翻转的答案相同。OCaml标准库中未定义函数组合。在这种情况下,这不是我偶尔错过的东西,我总是错过它

项目使用模块中的运算符
-|
定义函数组合(按照您给出的顺序)。正如lukstafi指出的(见下文),在未来的电池版本中,该操作员显然将更改为
%
。(我已经在他们的源代码树中验证了这一点。)


就我所见,Jane Street项目没有定义函数组合操作符。它在模块中定义了一个函数
compose

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

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


管道操作符在Core中以“|>”的形式提供。因此,您可以将表达式重写如下:
hx |>g |>f

我只想补充一点,操作符很容易包含在f中,它的定义很简单:

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

似乎不鼓励使用中缀合成运算符。(见附件)


你可以写
f@@g@@hx
而不是
f(g(hx))
也许这对你有帮助

let identite f = f
let (>>) = List.fold_right identite
测试:

在(Ocaml的另一个stdlib替代品)中,函数合成操作符称为
%
,可以在模块中找到:


谢谢你,杰弗里。你帮了我大忙。我目前还没有访问他们的文档。根据您的信息,我在Jane Street的Core.Std.Fn(c.f.,第31行)的源文件中找到了一个
compose
函数。谢谢。仅供参考,这是他们用于文档的传统链接,但它已关闭:(谢谢;我正在等待它是否恢复或是否有新的链接。)中的运算符,请参见我的。
@
运算符不是函数合成
@
具有以下类型:
('a->'b)->'a->'b
。函数组合具有以下类型:
('a->'b)->('c->'a)->'c->'b
。事实上@mookid提到中缀合成是不受欢迎的(这是我从未听说过的)。值得一提的是,SML将函数组合作为中缀运算符
o
。有些人认为Core的单管运算符
|>
是一个不错的选择,因为它简化了您必须记住的中缀运算符的数量。理论上,你可以有函数组合和管道操作符,每一个都是正向和反向的,所以总共有4个。但这真的有帮助吗?有些人认为这太过分了,只喜欢
。那太好了。在OCaml中,
>
操作符可以完美地工作。然而,
我测试了上面的两个定义,我没有看到任何证据支持你的说法。如果你想要一个好的答案,你必须发布一个完整的问题和一些示例代码。这看起来像是一个令牌接受错误。我将操作符定义为上面的和
让f=(+)1
让g=(*)3
。在REPL中,
(f>>g)10
33
。但是,
(f@BenSidhom,我发布的只是一个例子;你也可以很容易地使用任何其他关键字,我只是使用了f#one,因为有关于它们如何工作的文档。我知道,我可以通过使用不同的运算符符号来使它工作。我只是不明白为什么会出现这些奇怪的问题。我想f#没有问题用这些符号。
let (>>) f g x = g(f(x));;

(f >> g >> h) x = h(g(f(x))
let identite f = f
let (>>) = List.fold_right identite
# let f=fun x-> x+1 and
      g=fun x-> x*2 and
      h=fun x-> x+3;;

# [f;g;h] >> 2;;
- : int = 11
open Containers
open Fun

let is_zero n = (n = 0)

let nonzeros = List.filter (not % is_zero) [0;1;2;3;0]