Математические операторы Curry в Scala - PullRequest
7 голосов
/ 20 февраля 2012

Я хочу создать простую карту из математических операторов для соответствующих функций:

var ops = Map("+" -> +, "-" -> -)

Как бы я сделал это в Scala?

Ответы [ 2 ]

11 голосов
/ 20 февраля 2012

Если вы хотите, чтобы функции были каррированы, следующий способ, вероятно, является наиболее кратким способом сделать это.

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.

6 голосов
/ 20 февраля 2012
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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...