Это продолжение моего предыдущего вопроса. Предположим, я хотел бы сделать Stream
всех строк, соответствующих ^a+b+$
(один или несколько «а», а затем один или несколько «b»).Поток строк, соответствующих простому регулярному выражению в Scala
Я кодирования его следующим образом:
def interleave(s1:Stream[String], s2:Stream[String]): Stream[String] = if (s1.isEmpty) s2 else Stream.cons(s1.head, interleave(s2, s1.tail)) def generate(s1:Stream[String], s2:Stream[String]): Stream[String] = if (s1.isEmpty) s1 else interleave(s2.map(s1.head + _), generate(s1.tail, s2)) def as:Stream[String] = Stream.cons("a", as.map(_ + "a")) def bs:Stream[String] = Stream.cons("b", bs.map(_ + "b")) def solve = generate(as, bs)
К сожалению solve
терпит неудачу с out of memory
. Однако он отлично работает для конечных потоков: например solve(as take 10, bs take 10)
Как вы исправите код выше? Вы предпочли бы другой способ решить проблему?
Просто на стороне замечание: вы говорите, что вы хотите серию а, то б, но дон 't привязать ваше регулярное выражение к '$'? Почему это? – fge
@fge вы правы. Я исправляю регулярное выражение. – Michael
Параметр 's2' для' generate' должен быть 'Stream [String]' я предполагаю, а не 'Stream [Stream]'. также есть недостающая закрывающая скобка. – david