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 :: Intfilter :: (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]