只是一个简单的问题。我想知道在标准库中(或在Jane Street的核心或电池中)定义的OCaml中是否存在中缀函数组合运算符,就像Haskell中的(。)函数一样,因为我们可以写{{1},因此节省了很多括号。而不是不那么吸引人的(f . g . h) x
。
谢谢大家。
答案 0 :(得分:22)
这里的答案与flip
:-)相同。 OCaml标准库中未定义函数组合。在这种情况下,我不会偶尔想念它,我总是想念它。
OCaml Batteries Included项目使用BatStd
模块中的运算符-|
定义函数组合(按照您给出的顺序)。正如lukstafi指出的那样(见下文),这个运营商在未来的电池发布中显然会变为%
。 (我在他们的源代码树中验证了这一点。)
答案 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}}