OCaml中是否有中缀函数合成运算符?
只是一个简单的问题。我想知道在标准库(或Jane Street的Core或Batters)中定义的OCaml中是否有中缀函数组合运算符,比如Haskell中的(.)函数,它为我们节省了很多括号,因为我们可以编写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指出的(见下文),在未来的电池版
(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]