Scala中的数学运算符

Vla*_*ala 7 scala

我想创建一个从数学运算符到相关函数的简单Map:

var ops = Map("+" -> +, "-" -> -)
Run Code Online (Sandbox Code Playgroud)

我如何在Scala中执行此操作?

mis*_*tor 11

如果您希望将函数调整为咖喱,则以下可能是最简洁的方法.

scala> val ops: Map[String, Int => Int => Int] = Map(
     |   "+" -> (x => y => x + y),
     |   "-" -> (x => y => x - y)
     | )
ops: Map[String,Int => Int => Int] = Map(+ -> <function1>, - -> <function1>)
Run Code Online (Sandbox Code Playgroud)

然而,该地图仅限于Ints.如果您想要通用操作,则必须使用Numeric上下文绑定.

scala> def ops[N : Numeric]: Map[String, N => N => N] = {
     |   import Numeric.Implicits._
     |   Map(
     |     "+" -> (x => y => x + y),
     |     "-" -> (x => y => x - y)
     |   )
     | }
ops: [N](implicit evidence$1: Numeric[N])Map[String,N => N => N]
Run Code Online (Sandbox Code Playgroud)

这种方法的一个主要警告是每次调用时都会创建一个地图ops.


Dan*_*ral 6

val ops = Map("+" -> ((_: Int) + (_: Int)), "-" -> ((_: Int) - (_:Int)))
Run Code Online (Sandbox Code Playgroud)

要么

val ops = Map[String, (Int, Int) => Int]("+" -> (_+_), "-" -> (_-_))
Run Code Online (Sandbox Code Playgroud)

甚至,对于实际的currying,

val ops = Map("+" -> ((_: Int) + (_: Int)).curried, "-" -> ((_: Int) - (_:Int)).curried)
Run Code Online (Sandbox Code Playgroud)

这些函数都绑定到Int.好吧,Scala不是一种无点编程语言,它是一种面向对象的语言,而且所有数值类型都没有超类.无论如何,如果你反对,那么你有一个完全不同的问题,这在Stack Overflow上被多次询问和回答(事实上,这是我的第一个Scala问题,iirc).