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

发布于 2024-11-26 16:51:10 字数 242 浏览 1 评论 0原文

有没有办法在 Scala 中强制运算符优先级,就像在 Haskell 中使用 $ 一样?

例如,在 Haskell 中,您有:

a b c = ((a b) c)

在 Scala 中是否

a $ b c = a (b c)

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

Is there any way to force operator precedence in Scala like you do in Haskell with $?

For example, in Haskell, you have:

a b c = ((a b) c)

and

a $ b c = a (b c)

Is there a similar way to do this in Scala? I know Scala doesn't have operators per se, but is there a way to achieve a similar effect?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

怪我入戏太深 2024-12-03 16:51:10

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

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

It is possible to use implicits to achieve a similar effect. For example:
(untested, but should be something like this)

object Operator {

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

}

Using this system, you can't use the name $, because the name needs to end with a : (to fix the associativity) and the dollar is a normal identifier (not operator identifier), so you can't have it in the same name as a :, unless you separate them with underscores.

So, how do you use them? Like this:

val plusOne = (x: Int) => {x + 1}
plusOne &: plusOne &: plusOne &: 1
魂牵梦绕锁你心扉 2024-12-03 16:51:10

中缀 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)

Scala 对于中缀表示法中使用的运算符也有固定的优先顺序:

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

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

infix vs . notation is often used in a similar fashion to control precedence:

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 also has a fixed precedence ordering for operators used in infix notation:

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

Names can usually chosen explicitly to take advantage of this. For example, ~ and ^^ in the standard parsers library.

公布 2024-12-03 16:51:10

Scalaz 定义了一个“管道”运算符,其工作原理类似,但参数翻转。请参阅使用 scalaz 切换函数和对象|>

Scalaz has defined a "pipe" operator, which works similar, but with flipped arguments. See switch function and object with scalaz' |>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文