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

时间:2013-05-19 16:45:06

标签: ocaml ocaml-batteries ocaml-core

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

谢谢大家。

6 个答案:

答案 0 :(得分:22)

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

OCaml Batteries Included项目使用BatStd模块中的运算符-|定义函数组合(按照您给出的顺序)。正如lukstafi指出的那样(见下文),这个运营商在未来的电池发布中显然会变为%。 (我在他们的源代码树中验证了这一点。)

据我所知,Jane Street Core项目没有定义函数组合运算符。它在Fn模块中定义了一个函数compose

答案 1 :(得分:10)

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

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

具有类型签名:val ( << ) : f:('a -> 'b) -> g:('c -> 'a) -> x:'c -> 'b完全符合您的需要......

(f << g << h) x = f(g(h(x))

因此,如果您不需要

,则不需要电池项目

我想补充一点,看起来像<<的原因,正如您可能猜到的那样,因为>>运算符反其道而行:

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

(f >> g >> h) x = h(g(f(x))

答案 2 :(得分:9)

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

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

管道运算符可用作“|&gt;”在核心。因此,您可以将表达式重写为:h x |> g |> f

答案 3 :(得分:7)

似乎不鼓励使用中缀组合运算符。 (见this discussion)。

您可以写f @@ g @@ h x代替f (g (h x)))

答案 4 :(得分:1)

Containers(又是Ocaml的另一个stdlib替换)中,函数组合运算符被称为%,可以在CCFun模块中找到:

open Containers
open Fun

let is_zero n = (n = 0)

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

答案 5 :(得分:0)

也许这可以帮到你。

# let f=fun x-> x+1 and
      g=fun x-> x*2 and
      h=fun x-> x+3;;

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

试验:

{{1}}
相关问题