在多参数函数上使用美元符号

时间:2018-06-01 04:59:40

标签: haskell

c89.py

问题1: 为什么($)不适用于" p $ 2 $ 2 $ 5"?

问题2: 为什么($$)适用于" p $$ 2 $$ 2 $$ 5"?

问题3: 为什么($$)不适用于" p $$ [1] ++ [2..3] $$ 4 $$ 5"?

问题4: 是否有更优雅的方式来编写" p $$ [1] ++ [2..3] $$ [1] ++ [2..3] $$ 5"正确?

2 个答案:

答案 0 :(得分:5)

由于其固定性规范,答案在于运算符优先级。

($)的优先级为0,并且与

可以看到的右侧相关联
Prelude> :i ($)
...                                                                                                                                                                                 
infixr 0 $   

如果您希望自定义运算符具有您建议的优先级和关联性,则需要在代码中添加固定性声明:

infixl 0 $$

答案 1 :(得分:3)

$的目的是帮助减少表达式中括号()的数量。这是它的类型签名:

($) :: (a -> b) -> a -> b

换句话说,它所做的就是获取一个函数及其单个参数,并应用该函数。真无聊非常无聊。也就是说:

($) f x = f x    , or more simply,
($) f = f        , or more simply,
($) = id

唯一让($)值得的是它具有与常规函数id不同的优先级。 ($)具有非常优先级;相反,id等常规函数在应用程序中具有非常优先级。

作为中缀运算符时,$是右关联的。那是另一个有用的属性。

  

问题1:为什么($)不适用于“p $ 2 $ 2 $ 5”?

让我们摆脱一些$的迹象。以下都是等效的:

p $ 2 $ 2 $ 5
p (2 $ 2 $ 5)
p (2 (2 $ 5))
p (2 (2 5))

我想你可以弄清楚为什么(2 5)这样的表达没有任何意义。

  

问题2:为什么($$)适用于“p $$ 2 $$ 2 $$ 5”?

定义($$)等新功能时,默认情况下优先级最高。然后:

p $$ 2 $$ 2 $$ 5
(p $$ 2) $$ 2 $$ 5
((p $$ 2) $$ 2) $$ 5
((p 2) 2) 5

这当然是普通的部分应用。

  

问题3:为什么($$)不适用于“p $$ [1] ++ [2..3] $$ 4 $$ 5”?

p $$ [1]++[2..3] $$ 4 $$ 5
(((p $$ [1]) ++ [2..3]) $$ 4) $$ 5
(((p [1]) ++ [2..3]) 4) 5
  

问题4:是否有更优雅的方式正确编写“p $$ [1] ++ [2..3] $$ [1] ++ [2..3] $$ 5”吗

我认为没有古怪的$$。 :)