Joselo
Joselo

Reputation: 93

Applying partial functions where defined and a different function where not

This is a motivational example, Given:

List((1,2), (2,1), (3,1))

I'd like to return:

List((1,2),(3,1))

I've tried to do this in several ways. First:

List((1,2), (2,1), (3,1)) map { case (a,b) => if (a > b) (a,b) else (b,a) } 
distinct

Then I tried to use a tuple:

List((1,2), (3,4), (2,1)) map { t => if (t._1 <= t._2) t else t.swap }

then defining the partial function a little differently:

val pf: PartialFunction[(Int,Int), (Int,Int)] = {
  case (i, j) if i >= j => (j, i)
}

List((1,2), (3,4), (2,1)) map pf distinct

Is there a way that apply the PartialFunction only to the elementes that is defined for? or compound the PF with Identity in some how.

Upvotes: 2

Views: 273

Answers (1)

James Iry
James Iry

Reputation: 19367

Here's another form for the sake of completeness

List((1,2), (2,1), (3,1)) map { case x@(i,j) => if (i >= j) (j,i) else x } distinct

Which is basically the same several of your other forms.

Is there a way that apply the PartialFunction only to the elementes that is defined for? or compound the PF with Identity in some how.

Yes. applyOrElse.

In this case there's very little reason to check where your partial function is and isn't defined because the amount of work required to check definedness is going to be the same as the work the total function has to do before figuring out what to do (i.e. comparing the two elements).

But if you really want to

List((1,2), (3,4), (2,1)) map {x => pf.applyOrElse(x, identity[(Int, Int)])} distinct

Upvotes: 1

Related Questions