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项目没有定义函数组合运算符.它定义了一个函数compose中Fn的模块.
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)
Fn.composeCore中有函数,但它不是中缀运算符.此外,它作为常规函数实现并具有运行时开销.
实际上,使用管道操作员非常方便.它没有直接在编译器中实现的运行时开销(从4.00开始).有关详细信息,请参阅优化管道操作员.
管道运算符在Core中以"|>"形式提供.因此,您可以将表达式重写如下:h x |> g |> f