2012-02-20 11 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はポイントフリーのプログラミング言語ではなく、オブジェクト指向のプログラミング言語であり、すべての数値型に共通のスーパークラスはありません。とにかく、それに反対するならば、あなたはまったく異なる問題を抱えています。スタックオーバーフローについては何度も尋ねられ、答えられました(実際は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を呼び出すたびに作成されるということです。