2013-02-14 6 views
1

Я пытаюсь скомпилировать простой helloworld в Scala, и получить ошибку «scala: value capitalize не является членом Char» Почему компилятор считает, что newW Char?Scala: неправильный вывод типа при сопоставлении строк?

val dict = Map(
    "hello" -> "olleh", 
    "world" -> "dlrow" 
) 

def translate(input: String): String = { 
    input.split("""\s+""").map(w => dict.getOrElse(w.toLowerCase, w).map(newW => 
    (if (w(0).isUpper) newW.capitalize else newW)) 
).mkString(" ") 
} 

ответ

3

Второй вызов map в translate является отображение по значению, возвращенному из dict.getOrElse(...), чей тип String, который может быть неявно рассматривается как Iterable[Char]. Таким образом, компилятор правильно вывел, что newW имеет тип Char и жалуется, когда вы пытаетесь позвонить на него capitalize. Вы, вероятно, ищете что-то вдоль линий

def translate(input: String): String = { 
    input.split("""\s+""").map(w => { 
    val newW = dict.getOrElse(w.toLowerCase, w) 
    (if (w(0).isUpper) newW.capitalize else newW) 
    }).mkString(" ") 
} 

Update: Кстати, что потерпит неудачу во время выполнения, если input пустая строка - она ​​должна по крайней мере, еще одну проверку на безопасность.

+0

Технически, 'String' не' List [Char] ', в отличие от Haskell. Я думаю, что между ними существует неявное преобразование. –

+0

Вы правы, я обновил текст соответствующим образом. –

3

Вот что происходит:

input // is a string 
.split("""\s+""") // is an Array[String] 
.map(w => // w is a String, for each String in the Array[String] 
    dict.getOrElse(w.toLowerCase, w) // is a String (returned by dict.getOrElse) 
    .map(newW => // is a Char, for each Char in the String returned by dict.getOrElse 
Смежные вопросы