How to take a constant Integer as input in Partial Function?

时间:2017-12-18 05:38:52

标签: scala partial-functions

I am new to scala, I have a use case where I want to define a partial function to add three numbers in which one number is constant and two numbers can be passed as inputs and define another method which can take the partial function as input and gives its cube as result.

2 个答案:

答案 0 :(得分:2)

Well... That depends on where is your constant coming from?

Choice 1 - Your function forms a closure with a constant present in scope.

val yourConstant = 10

val pf: PartialFunction[(Int, Int), Int] = {
  case (x, y) => x + y + yourConstant
}

pf((5, 10))

Choice 2 - Your function has a local constant.

val pf: PartialFunction[(Int, Int), Int] = {
  case (x, y) => x + y + 10
}

pf((5, 10))

Also, as many others pointed out - this does not look like a use case of partial function. Are you sure that you want a Partial Function and not a partially applied function ?

if you were looking for a partially applied function then,

// first you need a curried function
// Curries function are function which can take parameters in steps to build intermidatary functions.

def normalDef(c: Int)(x: Int, y: Int): Int = c + y + x
// normalDef: normalDef[](val c: Int)(val x: Int,val y: Int) => Int

// now you can "partially apply" this "curried" function to your partially applied function

val addTo10PartiallyApplied = normalDef(10) _
// addTo10PartiallyApplied: (Int, Int) => Int = $Lambda$1240/1924827254@46202553

val total = addTo10PartiallyApplied(1, 2)
// total: Int = 13

答案 1 :(得分:1)

The following partial function adds 12345 to each number in the tuple passed to it

scala> val addConstantTo: PartialFunction[(Int, Int), Int] = {
     |   case (a, b) => a + b + 12345
     | }
addConstantTo: PartialFunction[(Int, Int),Int] = <function1>

scala> addConstantTo((12, 34))
res4: Int = 12391

This expands on the concept, by programmatically defining a partial function which adds any number to the elements of a tuple:

scala> def addTo(c: Int): PartialFunction[(Int, Int), Int] = {
     |   case (a, b) => a + b + c
     | }
addTo: (c: Int)PartialFunction[(Int, Int),Int]

scala> val pf = addTo(3)
pf: PartialFunction[(Int, Int),Int] = <function1>

scala> pf((1, 2))
res5: Int = 6

Let that sink in for a bit :)