有没有办法在Scala中强制运算符优先级,就像在Haskell中使用$一样?
例如,在Haskell中,您有:
a b c = ((a b) c)
Run Code Online (Sandbox Code Playgroud)
和
a $ b c = a (b c)
Run Code Online (Sandbox Code Playgroud)
在Scala中有类似的方法吗?我知道Scala本身没有运算符,但有没有办法实现类似的效果?
Ano*_*ous 17
可以使用含义来实现类似的效果.例如:(未经测试,但应该是这样的)
object Operator {
class WithOperator[T](that: T) {
def &:[U](f: T => U) = f(that)
}
implicit def withOperator[T](that: T) = new WithOperator(that)
}
Run Code Online (Sandbox Code Playgroud)
使用此系统,您不能使用名称$,因为名称需要以:(以修复关联性)结束,而美元是普通标识符(不是运营商标识符),因此您不能在同名:a,除非用下划线分隔它们.
那么,你如何使用它们?像这样:
val plusOne = (x: Int) => {x + 1}
plusOne &: plusOne &: plusOne &: 1
Run Code Online (Sandbox Code Playgroud)
Kev*_*ght 15
中缀vs.符号通常以类似的方式用于控制优先级:
a b c d == a.b(c).d
a.b c d == a.b.c(d)
a b c.d == a.b(c.d)
Run Code Online (Sandbox Code Playgroud)
对于中缀表示法中使用的运算符,Scala也有一个固定的优先顺序:
(all letters)
|
^
&
< >
= !
:
+ -
* / %
(all other special characters)
Run Code Online (Sandbox Code Playgroud)
通常可以明确选择名称以利用此功能.例如,~并且^^在标准解析器库.
| 归档时间: |
|
| 查看次数: |
2067 次 |
| 最近记录: |