关于两个haskell符号的问题以及它们的作用:$和\

时间:2011-04-07 20:23:58

标签: haskell syntax

有人可以用简单的词语向我解释这两位运营商的所作所为:

$

\

3 个答案:

答案 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

相关问题