2015-05-03 4 views
3

У меня есть следующий код, который должен подсчитывать количество раз, когда символ появляется в строке.Scala Filter Chars from String

def filter[T] (l: List[T], stays: T ⇒ Boolean): List[T] = { 
    if(l == Nil) return Nil 
    if (stays(l.head) == true) l.head :: filter(l.tail, stays) 
    else filter(l.tail, stays) 
    } 


    def countChar(s: String): List[(Char, Int)] = { 
    if (s == "") Nil 
    else (s(0), s.count(_ == s(0))) :: countChar(filter(s.toList, _ == s(0)).mkString) 
    } 

Теперь моя проблема заключается в том, что в

filter(s.toList, _ == s(0)) 

Я получаю ошибку: недостающий параметр типа. Я понимаю, что это происходит от вложенности функции?

Как я могу исправить это для работы? Я знаю, что у String есть некоторые способы делать то, что я хочу, но я бы хотел использовать свой собственный метод фильтрации.

ответ

6

Это ограничение Scala компилятором: он пытается выяснить, какой тип T в filter должно быть, используя оба аргумента l и stays. Но он терпит неудачу, потому что аргумент stays не указан.

Если вы не хотите, чтобы указать тип stays аргумента каждый раз (то есть, filter(s.toList, (_: Char) == s(0)), вы можете разделить filter «s список аргументов в два:

def filter[T] (l: List[T])(stays: T ⇒ Boolean): List[T] 

Тогда Scala будет знать, что T является Char, когда он анализирует тип stays. Вы можете позвонить этому filter с помощью filter(l.tail)(stays).