首页 > 解决方案 > 在多参数函数上使用美元符号

问题描述

Prelude> p a b c=1
Prelude> p $ 2 $ 2 $ 5
tons of error......
Prelude> ($$)=($)
Prelude> p $$ 2 $$ 2 $$ 5
1
Prelude>p $$ [2..3] $$ 4 $$ 5
1
Prelude>p $$ [1]++[2..3] $$ 4 $$ 5 
tons of error......
Prelude>p $$ [1]++[2..3] $$ [1]++[2..3] $$ 5
of course, tons of error......

问题 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”?

标签: haskell

解决方案


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

($)优先级为 0 并关联到右侧,可以看出

Prelude> :i ($)
...                                                                                                                                                                                 
infixr 0 $   

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

infixl 0 $$

推荐阅读