Reputation: 8263
I'm working on a Hacker Rank problem (https://www.hackerrank.com/challenges/eval-ex) and I got a bit stuck.
I have an exception that keeps coming up:
Solution.scala:12: error: type mismatch;
found : (Double, Double) => Double
required: (AnyVal, AnyVal) => AnyVal
(1 to 9).reduce((total: Double, current: Double) => Math.pow(exp,current)/factNonRecursive(current))
What am I doing wrong in this Scala code?
Full Code:
object Solution {
def factNonRecursive(num: Double): Double = {
(1 to (num.toInt)).foldLeft(1) ((a,b) => (a * b)) toDouble
}
def main(args: Array[String]) {
val sc = new java.util.Scanner (System.in);
var n = sc.nextInt();
var a0 = 1;
while(a0 < n){
var x = sc.nextDouble();
def e(exp: Double) = {
(1 to 9).reduce((total: Double, current: Double) => Math.pow(exp,current)/factNonRecursive(current))
}
println(e(x))
a0+=1;
}
}
}
Upvotes: 3
Views: 380
Reputation: 149538
This happens because you have a Range[Int]
, which you later call reduce
on and it expects an Int
, not a Double
, hence the compiler is inferring the common ancestor type for both which is AnyVal
. You'll need to map
the integers to doubles first:
(1 to 9)
.map(_.toDouble)
.reduce((_, current) => Math.pow(exp, current) / factNonRecursive(current))
Another approach, instead of Range
, would be to use List.range(1.0, 9.0)
and avoid the additional map
:
List.range(1.0, 9.0)
.reduce((_, current) => Math.pow(exp, current) / factNonRecursive(current))
Additionally, factNonRecursive
can be substituted with product
:
(1 to num.toInt).product.toDouble
Upvotes: 4