2016-03-06 2 views
0

В этом коде Scala я пытаюсь проанализировать строку, содержащую сумму (например, 12+3+5) и вернуть результат (20). Я использую регулярное выражение, чтобы извлечь первую цифру и проанализировать трейл, который будет добавлен рекурсивно. Моя проблема в том, что, поскольку регулярное выражение возвращает String, я не могу добавить числа. Есть идеи?Добавление чисел рекурсивно в Scala

object TestRecursive extends App { 

    val plus = """(\w*)\+(\w*)""".r 

    println(parse("12+3+5")) 

    def parse(str: String) : String = str match { 

    // sum 
    case plus(head, trail) => parse(head) + parse(trail) 

    case _ => str 
    } 


} 
+0

Почему не просто 'Println (12 + 3 + 5)'? ;) – Maroun

+0

Я пытаюсь построить калькулятор для пользователя, который вводит строку, и программа вычисляет результат – ps0604

+0

case _ => str.toInt – csharpfolk

ответ

2

Возможно, вы захотите использовать parser combinators для такого приложения.

"""(\w*)\+(\w*)""".r также соответствует "+" или "23+" или "4 +5" // but captures it only in the first group.

что вы могли бы сделать, может быть

scala> val numbers = "[+-]?\\d+" 
numbers: String = [+-]?\d+ 
           ^

scala> numbers.r.findAllIn("1+2-3+42").map(_.toInt).reduce(_ + _) 
res4: Int = 42 

scala> numbers.r.findAllIn("12+3+5").map(_.toInt).reduce(_ + _) 
res5: Int = 20 
+0

Что делать, если мне нужно добавить деление и умножение? – ps0604

+0

, тогда вы должны использовать настоящий парсер. –

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