Допустим, у меня есть некоторый API репозитория, в котором я обернул транзакции в монаду (Scalaz) Reader. Теперь я хочу выполнить вычисления по результатам и сохранить результаты обратно в репозиторий. Я пробовал что-то вроде:
type UOW[A] = Reader[Transaction, A]
object Record1Repo {
override def findAll: UOW[Seq[Record1]] = Reader(t => {
...
})
}
...
repo.run {
for {
all: Seq[Record1] <- Record1Repo.findAll
record: Record <- all
encoding: Encoding <- Processor.encode(record)
_ <- Record2Repo.save(Record2(encoding))
} yield {
logger.info(s"processed record id=${record.id}")
}}
Но он разваливается из-за тщетной попытки сопоставить результаты в record <- all
.
Я совершенно новичок в этом типе функционального программирования и не мог найти, как правильно выразить свое намерение. Любые предложения приветствуются.
record <- all
в фиктивную монаду? 19.09.2016<-
, возвращаютUOW[_]
. 19.09.2016A => B
в другую функциюF[A] => F[B]
, что приводит к естественному определениюF
как функтора. 19.09.2016