2010-11-03 16 views
32

Una pregunta rápida, ¿hay un operador en Haskell que funcione como el signo de dólar pero da prioridad al lado izquierdo? ES DECIR. en lugar de

f (x 1) 

que se escribe como

f $ x 1 

me gustaría escribir como

x 1 $ f 

Esto es puramente una cosa estilística. Estoy ejecutando una secuencia de funciones en orden y sería bueno si pudiera escribirlas a la izquierda para escribir para que coincidan con las que leí a la izquierda para escribir. Si hay un operador para esto?

[actualización] Un par de personas me han preguntado si no puedo definir el mío. En respuesta, quería comprobar que no había un operador existente antes de reinventar la rueda.

+4

Este es como el operador de composición de tuberías de F #. Discusión relacionada (sobre por qué no está integrada en Haskell): http://stackoverflow.com/questions/1457140/haskell-composition-vs-fs-pipe-forward-operator –

+0

Parece que la respuesta a mi pregunta es "no" .Gracias :) –

+2

Te das cuenta de que estás combinando aplicaciones de izquierda a derecha y de derecha a izquierda en la misma expresión, ¿no? La mayoría de las personas creo que se negarían a esto. La aplicación inversa es el llamado T-combinator. A menudo se denotaba con (#) hace unos años, pero ahora # es un símbolo especial en GHC, por lo que ya no se usa mucho. –

Respuesta

19

No sé, si hay un operador estándar, pero ¿qué le impide escribir el suyo? Esto funciona en ghci:

Prelude> let a $> b = b a 
Prelude> 1 $> (+2) 
3 
Prelude> sum [1, 2] $> (+2) 
5 
Prelude> map (+2) [1, 2] $> map (+3) 
[6,7] 

ACTUALIZACIÓN: buscar en Hoogle para a -> (a -> b) -> b (que es el tipo de este operador) encontrado nada útil.

+4

Parece que voy a usar esto, gracias. Un £ me atrae por el operador. –

+5

@Benjamin Confino: Los juegos de palabras siempre son agradables, pero para el uso en el mundo real, sugiero considerar '|>'. Como se señaló anteriormente, ese operador en F # hace exactamente lo que está buscando, por lo que usar el mismo nombre ayudará a las personas a entender su código más fácilmente. –

+2

Uno de los puntos fuertes de Haskell es que puede escribir sus propios operadores de flujo de control. ¿Haskell no tiene una construcción de "bucle"? ¡No hay problema! Solo escribe el tuyo. –

-1

No se puede simplemente redefinir $.

let ($) x f = f x 

O simplemente elegir un operador diferente, como $$

+3

La redefinición de un operador estándar no es una buena idea. – michau

4

No estoy al tanto de cualquier versión estándar, pero he visto (#) que se utiliza para ese fin en un par de lugares. El uno en particular que viene a la mente es HOC, que la utiliza en un idioma como:

someObject # someMessage param1 param2 

Creo recordar ver a otras bibliotecas "orientado a objetos" mediante el operador # de la misma manera, pero no puede recordar cuantos o cuales.

+2

Usos de lavado (#). Erik Meijer, Daan Leijen y James Hook lo usaron para guiar MS Agent con Active Haskell (un puente Haskell-COM). Posiblemente también se usó el puente inicial Haskell/ObjectiveC (#). –

10

Este combinador se define (en broma) en el data-aviary paquete:

Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2) 
Loading package data-aviary-0.2.3 ... linking ... done. 
3 

Aunque en realidad el uso de ese paquete es una cosa bastante tonta que hacer, la lectura de la fuente es divertido, y revela que se forma this combinator a través del hechizo mágico de flip id (o, en el lenguaje ornitológico, cardinal idiot).

+4

'' caridinalIdiot'' es un magnífico nombre combinador! – sclv

24

En Haskell puede utilizar flip para cambiar el orden de cualquier función u operador binario argumentos:

ghci> let (|>) = flip ($) 
ghci> 3 |> (+4) |> (*6) 
42 
+0

¡Solución muy elegante! –

Cuestiones relacionadas