2012-02-20 5 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에 대한 모든 바인드 있습니다. 글쎄, 스칼라는 point-free 프로그래밍 언어가 아닙니다. 객체 지향적 인 것입니다. 그리고 모든 숫자 형에 공통된 수퍼 클래스가없는 것입니다. 어쨌든, 만약 당신이 그것에 반대한다면, 당신은 완전히 다른 문제를 가지고 있습니다. 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를 호출 할 때마다 작성되는 것입니다.