2015-03-10 4 views
1

Я пытаюсь установить значение по умолчанию (х) => х для keyFunction параметра в следующей функции:как установить значения по умолчанию для параметров функции в Скале

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) 

Как я могу сделать это лучше? Заранее спасибо.

ответ

3

Вы можете добавить аргумент по умолчанию, как (x: A) => x, но вам придется разделить его в отдельный список параметров, если вы хотите Scala автоматически определить тип только с учетом list:

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) 
+0

А, понял. Он должен быть двумя отдельными списками параметров для того, чтобы вывод типа мог устранить, что означает 'A' в' A => A', только из 'List [A]'. Обновлено. – dhg

+0

Отлично! Оба точно работают. Спасибо за ваши хорошие решения и усилия. –

Смежные вопросы