Cuál es la diferencia entre . (punto) y $ (signo de dólar)?

Resuelto Rabarberski asked hace 15 años • 14 respuestas

¿ Cuál es la diferencia entre el punto (.)y el signo de dólar ($)?

Según tengo entendido, ambos son azúcar sintáctico por no necesitar usar paréntesis.

Rabarberski avatar Jun 02 '09 23:06 Rabarberski
Aceptado

El $operador sirve para evitar paréntesis. Todo lo que aparezca después tendrá prioridad sobre todo lo que venga antes.

Por ejemplo, digamos que tienes una línea que dice:

putStrLn (show (1 + 1))

Si desea deshacerse de esos paréntesis, cualquiera de las siguientes líneas también haría lo mismo:

putStrLn (show $ 1 + 1)
putStrLn $ show (1 + 1)
putStrLn $ show $ 1 + 1

El objetivo principal del .operador no es evitar paréntesis, sino encadenar funciones. Le permite vincular la salida de lo que aparece a la derecha con la entrada de lo que aparece a la izquierda. Por lo general, esto también genera menos paréntesis, pero funciona de manera diferente.

Volviendo al mismo ejemplo:

putStrLn (show (1 + 1))
  1. (1 + 1)no tiene una entrada y, por lo tanto, no se puede utilizar con el .operador.
  2. showpuede tomar un Inty devolver un String.
  3. putStrLnpuede tomar un Stringy devolver un IO ().

Puedes encadenar showpara que putStrLnte guste esto:

(putStrLn . show) (1 + 1)

Si hay demasiados paréntesis para su gusto, elimínelos con el $operador:

putStrLn . show $ 1 + 1
Michael Steele avatar Aug 17 '2009 22:08 Michael Steele

Tienen diferentes tipos y diferentes definiciones:

infixr 9 .
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) x = f (g x)

infixr 0 $
($) :: (a -> b) -> a -> b
f $ x = f x

($)está destinado a reemplazar la aplicación de funciones normales, pero con una precedencia diferente para ayudar a evitar paréntesis. (.)es para componer dos funciones juntas para crear una nueva función.

En algunos casos son intercambiables, pero en general no es así. El ejemplo típico donde se encuentran es:

f $ g $ h $ x

==>

f . g . h $ x

En otras palabras, en una cadena de $s, todos menos el último pueden ser reemplazados por.

Ganesh Sittampalam avatar Jun 02 '2009 16:06 Ganesh Sittampalam