에서 I는 관련 기능에 수학 사업자 간단한지도를 만들려면 :커링 수학 연산자는 스칼라
var ops = Map("+" -> +, "-" -> -)
가 어떻게 스칼라에서 이런 짓을 했을까?
에서 I는 관련 기능에 수학 사업자 간단한지도를 만들려면 :커링 수학 연산자는 스칼라
var ops = Map("+" -> +, "-" -> -)
가 어떻게 스칼라에서 이런 짓을 했을까?
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였습니다.
기능을 카레로 만들려면 다음을 수행하는 것이 가장 간단합니다.
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
를 호출 할 때마다 작성되는 것입니다.