2012-04-04 17 views
18

Tengo una función que uso con bastante frecuencia, lo que me permite escribir mi código de una manera que me parece más natural.Funciones de Haskell de izquierda a derecha

infixl 6 $: 
($:) :: a -> (a -> b) -> b 
a $: f = f a 

Esto me permite hacer algo así como

let x = getData 
     $: sort 
     $: group 
     $: aggregate 

en lugar de

let x = aggregate 
     $ group 
     $ sort 
     $ getData 

Recientemente he aprendido que Clojure tiene algo como esto construida en (no sé mucho Clojure, pero Creo que se escribiría (-> getData sort group aggregate)?) Lo que me hace preguntarme si Haskell también lo tiene incorporado. Hoogle doesn't have any results sin embargo.

¿Hay libs estándar con algo similar incluido? Probablemente mi código sea difícil de leer para otros si tengo una parte tan común es idiosincrásico.

+5

Mi preferencia es llamar a esta operación '#' como por OOHaskell, ya que es fundamentalmente la misma operación que la selección del método en los objetos y el '#' es el operador usado para este en OCaml. Alternativamente, al copiar F # podríamos usar '|>' –

+1

Diagrams también usa # it. – Long

+1

Hubo una propuesta para introducir 'flip ($)' a Data.Function, pero se eliminó porque no se pudo llegar a un consenso sobre si tal cosa sería útil (a diferencia de confundir a los principiantes, etc.). Aquí está la discusión: http://markmail.org/message/vsplpb7aajp7goqo?q=python – David

Respuesta

22

No hay nada como esta construida en, pero Control.Category.(>>>) está cerca: es flip (.), para que pueda escribir

f x = x $: sort $: group $: aggregate 

como

f = sort >>> group >>> aggregate 

Hay no shortage of definitions and names para su ($:) combinador. Creo que las funciones tienden a ajustarse al estilo de las tuberías más a menudo que las aplicaciones simples, por lo que no siento ninguna gran necesidad de ellas; (>>>) es un poco feo, sin embargo.

(Además, la semántica no estrictas de Haskell significa que el flujo de datos no es necesariamente en la dirección de las flechas apuntan aquí, después de todo, aggregate podría proporcionar el primer constructor antes sort siquiera tiene la oportunidad de mirar el . argumento por lo que tienden a utilizar sólo (.) y ($); estoy acostumbrado a la orden)

+2

Feo o no, creo que (>>>) es intuitivo porque se ve como (>> =), que es una canalización similar de izquierda a derecha. – amindfv

+0

Lástima que es 'flip (.)' En lugar de 'flip ($)'. Pero supongo que >> >>> 'es lo más cercano que puedes obtener. – Xodarap

+0

También hay (#) de http://hackage.haskell.org/packages/archive/diagrams-lib/0.4.0.1/doc/html/Diagrams-Util.html, pero tiene una precedencia infinita muy diferente que ($) – mgsloan

3

el operador aplicación inversa están describiendo su forma ahora parte del paquete estándar base (desde 4.8.0) como el & operator..

Tenga en cuenta que este operador se define con una precedencia inferior a la que propuso (infixl 1).

Cuestiones relacionadas