我想创建一个从数学运算符到相关函数的简单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.
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).
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |