Scala equivalent of Java's Number with divide method


I want to generalise this function

def selfSufficiency(a: Seq[Double], b: Seq[Double]): Double = 
  a.sum/b.sum

I tried using the ideas provided here to implement a more general function that work with Doubles, Floats, Ints, etc.:

def selfSufficiency[A](a: Seq[A], b: Seq[A])
     (implicit n: Numeric[A]):A = {
 import n._
 a.sum/b.sum
}

I however get a remark from eclipse saying that

value / is not a member of type parameter A.

1- How can I implement this in functional/generalisable way?

2- Does my implementation limits the user to have the same type "A" for both inputs? In other words, can I do this with my code?

selfSufficiency(Seq(1,2,3), Seq(2.0,1.3))

if I cannot, please explain how to implement this?

Please note that the code here provide a toy example. In my production function, I add, subtract, find the larger number, etc.

- - Source

Answers

answered 6 day ago Luis Miguel Mejía Suárez #1

The problem is that Numeric doesn't encode the division function - you need a Fractional.

Thus your code becomes

def selfSufficiency[A](a: Seq[A], b: Seq[A])
     (implicit n: Fractional[A]):A = {
 import n._
 a.sum/b.sum
}

And now it works.

Edit I just read this part of your question.

Does my implementation limits the user to have the same type "A" for both inputs? In other words, can I do this with my code?

Because both Fractional and Numeric are parametrized in just one T, both arguments have to be from the same type - for example take a look to the div function.

However, since numeric values of less precision are subtypes of the ones with higher (fig 1). You can make it work by upcast, but you will need to help the compiler a little more.

selfSufficiency[Double](Seq(1,2,3), Seq(2.0,1.3)) // res1: Double = 1.8181818181818183

Note: Without specifying the type as Double, the compiler will yield the following error.

error: could not find implicit value for parameter n: Fractional[AnyVal]

fig 1

scala-hierarchy

Reference: https://www.artima.com/pins1ed/scalas-hierarchy.html

answered 6 day ago SpencerPark #2

What you are looking for is the Fractional trait which is a more narrow Numeric (subtype) that supports div.

comments powered by Disqus