以算术运算符为参数的 scala 仿函数
scala functors taking arithmetic operators as argument
我想将算术运算符 +、*、/ 传递给 Option monad。
我可以为函数 (Double,Double) => Double
做到这一点,比如 math.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
}
"The operators"本身没有签名/类型,因为例如
+
不是有效的 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
。顺便说一句,这适用于任意复杂的函数文字,而不仅仅是运算符。因此,例如,如果您这样定义 class 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 = $$Lambda35/591589887@3303e89e
我希望这能回答您的问题以及您问题的大部分潜在修改。
我想将算术运算符 +、*、/ 传递给 Option monad。
我可以为函数 (Double,Double) => Double
做到这一点,比如 math.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
}
"The operators"本身没有签名/类型,因为例如
+
不是有效的 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
。顺便说一句,这适用于任意复杂的函数文字,而不仅仅是运算符。因此,例如,如果您这样定义 class Foo
:
case class Foo(i: Int) { def bar(d: Double) = i / d }
那么奇怪的构造 (_: Foo) bar (_: Double)
,它是 (_: Foo).bar(_: Double)
的中缀形式,是类型 (Foo, Double) => Double
:
scala> (_: Foo) bar (_: Double)
res4: (Foo, Double) => Double = $$Lambda35/591589887@3303e89e
我希望这能回答您的问题以及您问题的大部分潜在修改。