2013-11-16 3 views
0

У меня есть простая рекурсивная функция, чтобы преобразовать список булевых в строку:Scala: шаблон матч + конкатенация

def boolsToString(lst: List[Boolean]): String = lst match { 
    case Nil => "" 
    case x::xs => x match { 
     case false => "0" + boolsToString(xs) 
     case true => "1" + boolsToString(xs) 
    } 
    } 

Это работает, но я не хотел повторения boolsToString. Я хотел бы сделать конкатенацию только один раз (после случая):

def boolsToString2(lst: List[Boolean]): String = lst match { 
    case Nil => "" 
    case x::xs => x match { 
     case false => "0" 
     case true => "1" 
    } + boolsToString2(xs) 
    } 

, но это отвергается Scala компилятором: «„;“ ожидаемый, но идентификатор найден. "

Есть ли другой способ выполнения конкатенации строк только один раз, после случая?

ответ

3

Как насчет:

def boolsToString(lst: List[Boolean]): String = lst match { 
    case Nil => "" 
    case x::xs => (if (x) "1" else "0") + boolsToString(xs) 
    } 
+0

Short + very elegant. Приятно, спасибо! –

1

я понял это; трюк, чтобы получить оригинальную версию работать, чтобы поставить дополнительные скобки вокруг тела дела: ответ

def boolsToString2(lst: List[Boolean]): String = lst match { 
    case Nil => "" 
    case x::xs => (x match { 
     case false => "0" 
     case true => "1" 
    }) + boolsToString2(xs) 
} 

Но @Shadowlands' так гораздо лучше :-)

4

Нет необходимости изобретать колесо. Iterables уже имеют способ соединения элементов в строку, называемую mkString:

def boolsToString(lst: List[Boolean]) = 
    lst.map(if(_) "1" else "0").mkString("") 
Смежные вопросы