【问题标题】:scala functors taking arithmetic operators as argument以算术运算符为参数的 scala 函子
【发布时间】:2023-03-03 01:31:01
【问题描述】:

我想将算术运算符 +、*、/ 传递给 Option monad。 我可以为函数 (Double,Double) => Doublemath.pow 那样做

scala> def parseOp2(o1:Option[Double], o2:Option[Double], op: (Double,Double) => Double): Option[Double] =
     |     (o1,o2) match {
     |       case (Some(d1), Some(d2)) => Some(op(d1,d2))
     |       case _ => None
     |     }
parseOp2: (o1: Option[Double], o2: Option[Double], op: (Double, Double) => Double)Option[Double]

scala> parseOp2(Some(2),Some(3),math.pow)
res39: Option[Double] = Some(8.0)

但是这些运算符的签名是什么。我试过了

def parseOp2(o1:Option[Double], o2:Option[Double], op: Double => Double): Option[Double] =
  (o1,o2) match {
    case (Some(d1), Some(d2)) => Some(d1.op(d2))
    case _ => None
  }

【问题讨论】:

    标签: scala functor


    【解决方案1】:

    “操作员”本身没有签名/类型,因为例如

    +
    

    不是有效的 Scala 表达式。

    你能得到的最接近的是:

    (_ :Double) + (_: Double)
    

    这东西确实是一个合法的scala表达式,它的类型是(Double, Double) => Double

    此外,如果您有一个可以从中推断类型的上下文,那么您可以删除显式类型归属,如下例所示:

    def foo(f: (Double, Double) => Double): Unit = println(f(42,3141595))
    def foo(_ + _) // no "(_:Double)" necessary here
    

    _ + _ 表达式的类型将被自动推断,它将再次为(Double, Double) => Double。顺便说一句,这适用于任意复杂的函数文字,而不仅仅是运算符。因此,例如,如果您像这样定义 Foo 类:

    case class Foo(i: Int) { def bar(d: Double) = i / d }
    

    那么奇怪的构造(_: Foo) bar (_: Double),它是(_: Foo).bar(_: Double) 的中缀形式,是(Foo, Double) => Double 类型的有效scala 表达式:

    scala> (_: Foo) bar (_: Double)
    res4: (Foo, Double) => Double = $$Lambda$1335/591589887@3303e89e
    

    我希望这能回答您的问题以及您问题的大部分潜在修改。

    【讨论】:

    • 是的,非常感谢......对现场修改感到抱歉!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2019-07-19
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多