Как правильно написать функцию foldLeft, которая может дать сбой? - PullRequest
0 голосов
/ 12 июня 2018

Рассмотрим следующий фрагмент

def sayManyTimes(a: String): IO[String] = IO(a * 3)    
(1 to 2).foldLeft("Read this: ")((c, i) => 
    c + sayManyTimes("mayo").unsafeRunSync)

Теперь, это дает желаемый результат, но не идеально, потому что это небезопасная операция.

Я хотел бы реструктурировать код так, чтобывторая строка, вместо возврата строки, возвращает IO, который создаст строку.

1 Ответ

0 голосов
/ 12 июня 2018

Так что же не так с пониманием?

(1 to 2).foldLeft(IO("Read this: "))((c, i) =>
  for {
    cc <- c
    smt <- sayManyTimes("mayo")
  } yield cc + smt)

Вы также можете расширить для понимания вручную:

(1 to 2).foldLeft(IO("Read this: ")){ (c, _) =>
  c.flatMap(cc => 
    sayManyTimes("mayo").map(cc + _)
  )
}
...