Na minha prática de programação em OCaml, descobri recentemente que o seguinte operador de pipeline é muito útil para criar funções.
let (>|) f g x = g (f x)
val ( >| ) : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c = <fun>
Eu o uso para substituir códigos como:
fun s -> int_of_string s |> Int.hash
- : string -> int = <fun>
Pelo mais simples:
int_of_string >| Int.hash
- : string -> int = <fun>
A associatividade funciona bem:
int_of_string >| float_of_int >| string_of_float
- : string -> string = <fun>
Isso seria uma melhoria valiosa da linguagem principal e, se sim, como enviar essa contribuição?
Isso é chamado de composição de função. Em Haskell o operador é
.
, e em Elm e F# é>>
. Eles funcionam bem em linguagens puramente funcionais, mas infelizmente são vítimas da restrição de valor em linguagens que permitem tanto polimorfismo quanto efeitos colaterais, como OCaml, e, portanto, é improvável que sejam aceitos, eu acho.Este exemplo ilustra o problema:
Para detalhes sobre a restrição de valor e as limitações do polimorfismo em OCaml, veja o manual do OCaml . Mas a essência disso (como eu entendo) é que se houver uma possibilidade de mutação e polimorfismo serem misturados, variáveis de tipo não podem ser totalmente generalizadas e serão substituídas por variáveis de tipo fracas , que podem ser determinadas em algum momento posterior, como quando são usadas pela primeira vez, mas não podem ser polimórficas. Para o propósito de uma função de composição, isso infelizmente a torna bastante restritiva e confusa de lidar.
OCaml, no entanto, relaxa um pouco a restrição de valor e permite tais funções se forem funções sintáticas. O que significa que você pode fazer
Mas então você pode muito bem fazer
ou
Como adendo à resposta de glennsl, você encontrará isso ao aplicar parcialmente funções polimórficas, mas não ao vincular um novo nome a uma função polimórfica.
Note, porém, que aplicar parcialmente
g
novamente produz outra função com parâmetros fracamente tipados. O grau em que você tem que se preocupar com esse problema com aplicação parcial é diretamente proporcional ao tempo de vida dessa função.Você não deve hesitar em usar a aplicação parcial para funções de curta duração, onde a expressividade do seu código não é prejudicada pelo seu uso.