如何在scala中设置函数参数的默认值

如何在scala中设置函数参数的默认值,scala,functional-programming,type-parameter,Scala,Functional Programming,Type Parameter,我正在尝试为以下函数中的参数keyFunction设置默认值(x)=>x: def count[A, B](list: List[A], keyFunction: (A) => B, isRatio : Boolean = false): Map[B, Double] = { lazy val number = list.size.toDouble list.groupBy(keyFunction).map{ case (key, group) => if

我正在尝试为以下函数中的参数keyFunction设置默认值(x)=>x:

def count[A, B](list: List[A], keyFunction: (A) => B, isRatio : Boolean = false): Map[B, Double] = {
    lazy val number = list.size.toDouble
    list.groupBy(keyFunction).map{
      case (key, group) => if (isRatio) (key, group.size/number) else (key, group.size.toDouble)
    }
  }
我知道一个愚蠢的解决方案就是定义另一个函数:

  def simplyCount[A] (list: List[A], isRatio: Boolean = false): Map[A, Double] = count(list, (e: A) => e, isRatio)

我怎样才能做得更好?提前感谢。

您可以将默认参数添加为
(x:A)=>x
,但如果您希望Scala仅在
列表中自动推断类型,则必须将其分离到单独的参数列表中:

def count[A, B](list: List[A])(keyFunction: (A) => B = (x: A) => x, isRatio: Boolean = false): Map[B, Double] {
  ???
}

count(List("a", "B", "a", "c"))()
// Map(a -> 2.0, c -> 1.0, B -> 1.0)
您可以将其作为一个参数列表来执行,但您必须显式地为其指定类型,因为类型推断将无法找出它:

def count[A, B](list: List[A], keyFunction: (A) => B = (x: A) => x, isRatio: Boolean = false): Map[B, Double] {
  ???
}

count[String,String](List("a", "B", "a", "c"))
// Map(a -> 2.0, c -> 1.0, B -> 1.0)

啊,明白了。它需要有两个独立的参数列表,以便类型推断仅从
列表[A]
中消除
A
A=>A
中的含义的歧义。更新,太好了!两种方法都很有效。感谢您的出色解决方案和努力。