2016-09-19 14 views
0

私が(Scalaz)ReaderモナドでトランザクションをラップしたリポジトリAPIがあるとします。今私は、結果を計算し、その結果をリポジトリに保存し直したいと思っています。Scalaのリーダーモナドの結果の連結

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}") 
     }} 

...

type UOW[A] = Reader[Transaction, A] 

object Record1Repo { 

    override def findAll: UOW[Seq[Record1]] = Reader(t => { 
    ... 
    }) 
} 

しかし、それはrecord <- allで結果の上にマッピングする無益な試みで崩壊してしまう:私のようなものを試してみました。

私はこのタイプの関数型プログラミングには全く新しいので、自分の意図を正しく表現する方法が見つからなかったのです。どんな提案も大歓迎です。

答えて

1

Readerモナドから脱出しているために失敗します。

Readerで始まり、Seqから抽出すると、Reader構造内のflatMap/mapチェーンでは変換できません。

+0

ダミーモナドの中に 'record < - all'を入れる必要がありますか? – Eddy

+0

'< - 'の右側にあるものが 'UOW [_]'を返すようにする必要があります。 – pierangeloc

+0

だから、私は第2ステップと第3ステップをインラインUOWに投げ捨てました。それはうまくいくようですが、それはかなり醜く、無意味です。 – Eddy

関連する問題