Haskell中的$意味着什么?
当你写更复杂的函数时,我注意到$被使用了很多,但是我不知道它的作用。 
  $是中缀“应用程序”。 它被定义为 
 ($) :: (a -> b) -> (a -> b) f $ x = fx -- or ($) fx = fx -- or ($) = id 
 避免多余的括号是有用的: f (gx) == f $ gx 。 
一个特别有用的位置就是“拉姆达体”
 forM_ [1..10] $ \i -> do l <- readLine replicateM_ i $ print l 
相比
 forM_ [1..10] (\i -> do l <- readLine replicateM_ i (print l) ) 
或者,有时候,在expression“将这个论点应用于任何函数”时,
 applyArg :: a -> (a -> b) -> b applyArg x = ($ x) >>> map ($ 10) [(+1), (+2), (+3)] [11, 12, 13] 
我喜欢把$符号看作是括号的替代。
例如,下面的expression式:
 take 1 $ filter even [1..10] -- = [2] 
如果我们不把这个$放到什么地方呢? 然后会得到
 take 1 filter even [1..10] 
 编译器现在会抱怨,因为它会认为我们试图将4个参数应用于take函数,参数是1 :: Int , filter :: (a -> Bool) -> [a] -> [a] , even :: Integral a => a -> Bool , [1..10] :: [Int] 。 
这显然是不正确的。 那我们能做些什么呢? 那么,我们可以把括号放在我们的expression中:
 (take 1) (filter even [1..10]) 
这不会减less到:
 (take 1) ([2,4,6,8,10]) 
然后变成:
 take 1 [2,4,6,8,10] 
 但是我们并不总是想写括号,特别是我们的function开始互相嵌套。 另一种方法是将$符号放在括号所在的位置之间,在这种情况下是: 
 take 1 $ filter even [1..10]