dcheng
dcheng

Reputation: 1847

missing parameter type for `_`

I'm trying to sort a list by how close the entries of a list are to num.

I decided to try use sortWith, but the following snippet:

list.sortWith(math.abs(_ - num) < math.abs(_ - num))

failed with missing parameter type for _ in scala. list is of type List[Int].

Following the other threads, I know that _ is somehow type ambiguous, but I'm not sure why, (and why the following snippet is not type ambiguous):

scala> val sortedDudes = dudes.sortWith(_.name < _.name)
sortedDudes: Array[Person] = Array(Al, Paul, Tyler)

(Source)

Upvotes: 0

Views: 481

Answers (2)

moem
moem

Reputation: 556

In Scala, _ can be used in a variety of different situations to mean different things. The answers on this question should help clarify a few of them.

Going back to the question, it seems the OP is trying to use _ for parameter replacement. Consider the following example

List(1,2,5,7).filter(_ > 4)

Here filter takes a function of type A => Unit, so the above is shorthand for

List(1,2,5,7).filter(x => x > 4)

The underscore can stand for more than one parameter, but it must be used to refer to each parameter exactly once. This is why the sortedDudes snippet in the OP works. Therefore the following is legal.

List(1,2,5,7).reduce(_ + _)

which is shorthand for

List(1,2,5,7).reduce((a,b) => a + b)

I think the problem with the original snippet is that the compiler cannot unambiguously parse it into something of type (A, A) => Boolean as required by the sortWith method. We can give the compiler a little help as follows.

scala> def op(int: Int, num: Int) = math.abs(int - num)
op: (int: Int, num: Int)Int

scala> List(1,7,5,10).sortWith(op(_, 5) < op(_, 5))
res0: List[Int] = List(5, 7, 1, 10)

Upvotes: 1

Vasilisck
Vasilisck

Reputation: 105

 def foo = {
    val num = 2
    val list: List[Int] = List(1, 2)
    list.sortWith((a, b) => math.abs(a - num) < math.abs(b - num))
  }

work perfectly. It's because scala trying get _ from math.abs, not sortWith

Upvotes: 3

Related Questions