有人可以用简单的词语向我解释这两位运营商的所作所为:
$
\
答案 0 :(得分:15)
\
不是运算符,它是文字语法的一部分。更确切地说,它是两个文字语法的一部分:它表示一个lambda文字,它在字符串文字中用作转义字符。
运算符$
在序言中定义为
($) :: (a -> b) -> a -> b
f $ x = f x
换句话说,它确实与空白完全相同,即只是普通的函数应用程序。 然而,虽然函数应用程序是左关联的并且具有高优先级(实际上是最高的),$
是右关联的并且具有低优先级。
当你有f
应用于g
的链应用于h
应用于x
时,这允许你省略括号,没有$
}运算符将被写成
f (g (h x))
但是操作符可以写成
f $ g $ h x
如果要将函数应用程序运算符本身作为参数传递给另一个函数,这也很有用。比如,您有函数列表和值列表,并且您希望将列表中的每个函数应用到另一个列表中的相应值:
zipWith ($) fs xs
答案 1 :(得分:7)
这两个运营商做了什么:$ \
第一个是($)
,是一个运算符,定义为:
-- | Application operator. This operator is redundant, since ordinary
-- application @(f x)@ means the same as @(f '$' x)@. However, '$' has
-- low, right-associative binding precedence, so it sometimes allows
-- parentheses to be omitted; for example:
--
-- > f $ g $ h x = f (g (h x))
--
-- It is also useful in higher-order situations, such as @'map' ('$' 0) xs@,
-- or @'Data.List.zipWith' ('$') fs xs@.
($) :: (a -> b) -> a -> b
f $ x = f x
它允许您使用较少的括号来编写函数。
第二个标记\
是lambda abstractions - 匿名函数的Haskell语法的一部分。
所以,例如。
\x -> x + 1
是一个将参数加1的函数。 lambda抽象的语法是described in the Haskell Report。
答案 2 :(得分:2)
($)::(a - > b) - > a - > b base Prelude,base Data.Function 应用运营商。该运算符是冗余的,因为普通应用(f x)与(f $ x)相同。但是,$具有低的,右关联的绑定优先级,因此它有时允许省略括号;
关键字 反斜杠“\”用于多行字符串> “foo \> \ bar”>在lambda函数中> > \ x - > x + 1