是否有类似于 Haskell 的 $(美元符号)的 Scala 运算符?

Posted

技术标签:

【中文标题】是否有类似于 Haskell 的 $(美元符号)的 Scala 运算符?【英文标题】:Is there a Scala operator similar to Haskell's $ (dollar sign)? 【发布时间】:2011-10-14 03:42:39 【问题描述】:

有什么方法可以像在 Haskell 中使用 $ 那样在 Scala 中强制运算符优先级?

例如,在 Haskell 中,您有:

a b c = ((a b) c)

a $ b c = a (b c)

在 Scala 中是否有类似的方法可以做到这一点?我知道 Scala 本身没有运算符,但是有没有办法达到类似的效果?

【问题讨论】:

【参考方案1】:

可以使用隐式来实现类似的效果。例如: (未经测试,但应该是这样的)

object Operator 

  class WithOperator[T](that: T) 
    def &:[U](f: T => U) = f(that)
  
  implicit def withOperator[T](that: T) = new WithOperator(that)


使用这个系统,你不能使用名称$,因为名称需要以:结尾(固定关联性)并且美元是一个普通标识符(不是操作符标识符),所以你不能有它与 : 同名,除非你用下划线分隔它们。

那么,你如何使用它们?像这样:

val plusOne = (x: Int) => x + 1
plusOne &: plusOne &: plusOne &: 1

【讨论】:

【参考方案2】:

中缀与 .符号通常以类似的方式用于控制优先级:

a b c d == a.b(c).d
a.b c d == a.b.c(d)
a b c.d == a.b(c.d)

Scala 还为中缀表示法中使用的运算符提供了固定的优先顺序:

(all letters)
|
^
&
< >
= !
:
+ -
* / %
(all other special characters)

通常可以显式选择名称来利用这一点。例如,标准解析器库中的~^^

【讨论】:

被一个不解释的幻影投票者再次追杀......最奇怪 可爱的代码 sn-p 第一个 - 我会方便地提醒自己这些规则。谢谢【参考方案3】:

Scalaz 定义了一个“管道”操作符,它的工作方式类似,但带有翻转的参数。见switch function and object with scalaz' |>

【讨论】:

以上是关于是否有类似于 Haskell 的 $(美元符号)的 Scala 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

Scala 是不是有类似于 Haskell 的 `$` 的运算符?

Haskell $ 运算符是不是有逆运算?

是否有类似Python的Haskell可迭代解包方式?

是否有任何类似于 objcopy 的命令可以从共享对象文件中删除符号?

Haskell GLUT 库中的 ($=)(美元等于)运算符有啥作用?

是否有适用于 Haskell 的简单颜色启用记录器?