$
is infix "application". It's defined as
($) :: (a -> b) -> (a -> b)
f $ x = f x
-- or
($) f x = f x
-- or
($) = id
It's useful for avoiding extra parentheses: f (g x) == f $ g x
.
A particularly useful location for it is for a "trailing lambda body" like
forM_ [1..10] $ i -> do
l <- readLine
replicateM_ i $ print l
compared to
forM_ [1..10] (i -> do
l <- readLine
replicateM_ i (print l)
)
Or, trickily, it shows up sectioned sometimes when expressing "apply this argument to whatever function"
applyArg :: a -> (a -> b) -> b
applyArg x = ($ x)
>>> map ($ 10) [(+1), (+2), (+3)]
[11, 12, 13]
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…