私はScalaのフリーモナドについて学んでおり、私はネコを使ってフリーモナドに持ちこたえることができる簡単な代数の例をまとめました。Scalaのフリーモナドでのモナド効果の積み上げ
は、ここに私の代数
sealed trait ConsultationOp[A]
object consultation {
case class Create(c: Consultation) extends ConsultationOp[Unit]
case class Get(s: ConsultationId) extends ConsultationOp[Option[Consultation]]
}
だと私はFree
からConsultationOp
からリフティングが暗黙的に実行される
def app = for {
c <- consultation.Create(Consultation("123", "A consultation"))
_ <- consultation.Get(c._id)
} yield()
def interpreters = ConsultationInterpreter or UserInterpreter
app.foldMap(interpreters)
のようにそれを使用することができますよ。これまでのところ
とても良いが、何であれば、私はconsultation.Get
によって返されたオプションの値を抽出する必要があります。
(https://github.com/gabro/free-api不足している詳細の多くがあります、完全な作業実装はここにあります)。
心に来る最初の事はモナド変換子である、すなわち
def app = for {
c <- consultation.Create(Consultation("123", "A consultation")).liftM[OptionT]
d <- OptionT(consultation.Get(c._id))
_ <- doSomethingAConsultation(d)
} yield()
のようなものが、それは醜い、それが右に感じることはありません。
無料のモナドを使用しているときにモナド効果を積み重ねる方法は何ですか?
この[here](https://www.reddit.com/r/scala/comments/5p3fc3/free_monads_in_scala_web_stack_part_i/dco5yqy/)に関連する議論があります。要点は、Freeを使用しても、 'ConsultationOp'の中で' A'という値を扱うことが自由になるわけではないということです。 [freek](https://github.com/ProjectSeptemberInc/freek)や[eff](https://github.com/atnos-org/eff)のようなライブラリは、この問題をよりエレガントに解決します。 –