2016-09-19 46 views
0

比方说,我有一些Repository API,我已经在(Scalaz)阅读器monad中封装了这些事务。现在我想对结果运行计算,并将结果保存回存储库。我想是这样的:Scala中阅读器monads的链接结果

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分崩离析。

我对这种类型的函数式编程还很陌生,无法正确地表达我的意图。任何建议,欢迎。

回答

1

它失败了,因为你打破了Reader monad。

开始时你有Reader,然后你从Seq所以这不能在Reader结构内的flatMap/map链翻译提取。

+0

对,所以我需要在虚拟monad中填充'record < - all'? – Eddy

+0

您需要确保'<-'右侧的内容返回'UOW [_]'。 – pierangeloc

+0

所以,我把第二步和第三步放到了一个内联UOW中,它似乎可以工作,但它非常丑陋,毫无意义......这是否是“提升”? – Eddy