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"正确?
答案 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”吗
我认为没有古怪的$$
。 :)