に私は、関連する機能に数学の事業者からの簡単な地図を作成したい:カリー化数学演算子は、Scalaの
var ops = Map("+" -> +, "-" -> -)
がどのように私はScalaでこれを行うのでしょうか?
に私は、関連する機能に数学の事業者からの簡単な地図を作成したい:カリー化数学演算子は、Scalaの
var ops = Map("+" -> +, "-" -> -)
がどのように私はScalaでこれを行うのでしょうか?
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でした)。
機能をカレートするには、以下の方法がおそらく最も簡潔な方法です。
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
を呼び出すたびに作成されるということです。