programacion - ¿Hay un operador de composición de funciones infijo en OCaml?
oz lenguaje de programacion (6)
Sólo una pregunta rápida. Me pregunto si hay un operador de composición de funciones de infijo en OCaml definido en la biblioteca estándar (o en el núcleo de Jane Street o en Baterías) como la función (.) En Haskell que nos guarda muchos paréntesis ya que podemos escribir (f . g . h) x
lugar de la menos atractiva f (g (hx)))
.
Gracias amigos.
El uso de un operador de composición de infijo parece estar desaconsejado. (ver esta discusión ).
Puede escribir f @@ g @@ hx
lugar de f (g (hx)))
.
En Containers (otro reemplazo estándar para Ocaml), el operador de composición de funciones se llama %
y se puede encontrar en el módulo CCFun :
open Containers
open Fun
let is_zero n = (n = 0)
let nonzeros = List.filter (not % is_zero) [0;1;2;3;0]
Hay Fn.compose
función Fn.compose
en Core, pero no es un operador de infijo. Además, se implementa como una función regular y tiene una sobrecarga de tiempo de ejecución.
En la práctica, es muy conveniente utilizar un operador de tubería. No tiene una sobrecarga de tiempo de ejecución como se implementa directamente en el compilador (a partir de 4.00). Ver Operadores de tubería optimizados para más detalles.
El operador de tubería está disponible como ''|>'' en Core. Entonces, puedes reescribir tu expresión de la siguiente manera: hx |> g |> f
La respuesta aquí es la misma que para flip
:-). La composición de la función no está definida en la biblioteca estándar de OCaml. En este caso, no es algo que echo de menos de vez en cuando, lo echo de menos todo el tiempo.
El proyecto OCaml Batteries Included define la composición de la función (en el orden que usted da) utilizando el operador -|
en el modulo de BatStd
. Como señala lukstafi (ver más abajo), este operador aparentemente cambiará a %
en una versión futura de Baterías. (He verificado esto en su árbol fuente).
Por lo que puedo ver, el proyecto Jane Street Core no define un operador de composición de funciones. Define una función compose
en el módulo Fn
.
Solo quiero agregar que el operador es bastante fácil de incluir, en F # se define simplemente como:
let (<<) f g x = f(g(x));;
que tiene la firma de tipo: val ( << ) : f:(''a -> ''b) -> g:(''c -> ''a) -> x:''c -> ''b
haciendo exactamente lo que necesita. ..
(f << g << h) x = f(g(h(x))
por lo que no necesita el proyecto de baterías si no tiene que
Me gustaría agregar que la razón por la que se ve es <<
es, como puede suponer, porque el operador >>
hace lo contrario:
let (>>) f g x = g(f(x));;
(f >> g >> h) x = h(g(f(x))
Tal vez eso podría ayudarte.
let identite f = f
let (>>) = List.fold_right identite
prueba:
# let f=fun x-> x+1 and
g=fun x-> x*2 and
h=fun x-> x+3;;
# [f;g;h] >> 2;;
- : int = 11