I don’t understand why the compiler thinks this method call is ambiguous. Or am I misinterpreting the compiler message?
Isn’t it the case that my call Assignment(Set())
is unambiguous?
Error:(257, 42) overloaded method value apply with alternatives:
(trueVariables: Set[Int])bdd.Assignment <and>
(bitMask: Long)bdd.Assignment
cannot be applied to (scala.collection.Set[Int])
println("a+b =" + Or(Bdd(1), Bdd(2))(Assignment(Set(1))))
Here is the call-site
test("printer") {
import Bdd._
println("a+b =" + Or(Bdd(1), Bdd(2))(Assignment(Set(1))))
println("a+b =" + Or(Bdd(1), Bdd(2))(Assignment(Set(2))))
println("a+b =" + Or(Bdd(1), Bdd(2))(Assignment(Set(1, 2))))
println("a+b =" + Or(Bdd(1), Bdd(2))(Assignment(Set[Int]())))
println("a&b =" + And(Bdd(1), Bdd(2))(Assignment(Set(1))))
println("a&b =" + And(Bdd(1), Bdd(2))(Assignment(Set(2))))
println("a&b =" + And(Bdd(1), Bdd(2))(Assignment(Set(1, 2))))
println("a&b =" + And(Bdd(1), Bdd(2))(Assignment(Set[Int]())))
val bdd = Or(Bdd(1), Not(Bdd(2)))
println("xnor" + Xnor(bdd, bdd))
}
And here are the definitions of Assignment
package bdd
case class Assignment(trueVariables:Set[Int]) {
def value(v:Int):Boolean = {
trueVariables.contains(v)
}
}
object Assignment {
def apply(bitMask: Long): Assignment = {
def recur(bitMask: Long, bit: Int, set: Set[Int]): Set[Int] = {
if (0 == bitMask)
set
else if (0 == bitMask % 2)
recur(bitMask / 2, bit + 1, set)
else
recur(bitMask / 2, bit + 1, set + bit)
}
Assignment(recur(bitMask, 1, Set()))
}
}