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]