Cuál es la diferencia entre . (punto) y $ (signo de dólar)?
¿ 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.
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)
no tiene una entrada y, por lo tanto, no se puede utilizar con el.
operador.show
puede tomar unInt
y devolver unString
.putStrLn
puede tomar unString
y devolver unIO ()
.
Puedes encadenar show
para que putStrLn
te guste esto:
(putStrLn . show) (1 + 1)
Si hay demasiados paréntesis para su gusto, elimínelos con el $
operador:
putStrLn . show $ 1 + 1
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.