2016-09-19 40 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