2012-02-20 71 views

回答

6
val ops = Map("+" -> ((_: Int) + (_: Int)), "-" -> ((_: Int) - (_:Int))) 

val ops = Map[String, (Int, Int) => Int]("+" -> (_+_), "-" -> (_-_)) 

或甚至,對於實際鑽營,

val ops = Map("+" -> ((_: Int) + (_: Int)).curried, "-" -> ((_: Int) - (_:Int)).curried) 

這些功能都結合Int。那麼,Scala並不是一個無點的編程語言,它是一個面向對象的編程語言,並且沒有所有數字類型共有的超類。無論如何,如果你反對,那麼你就會遇到一個完全不同的問題,這個問題在堆棧溢出(Stack Overflow)中被多次詢問和回答(實際上,這是我的第一個Scala問題,iirc)。

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

此地圖然而僅限於Int秒。如果你想要通用操作,你將不得不使用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] 

這種方法的一個重要的條件是,地圖被創建每次調用ops時間。