びっくりするほど雑なサンプルですわ。
package com.example import monocle.Prism object SamplePrismCaseClass { def main(args: Array[String]): Unit = { sealed trait Day case class Monday() extends Day case class Tuesday() extends Day case class Wednesday() extends Day case class Thursday() extends Day case class Friday() extends Day case class Saturday() extends Day case class Sunday() extends Day case class Sample(day: Day) val _tuesday = Prism[Sample, Day]{ case x if x.day == Tuesday() => Option(x.day) case _ => None } { x => Sample(x) } println(_tuesday.reverseGet(Tuesday())) // Sample(Tuesday()) println(_tuesday.getOption(Sample(Monday()))) // None println(_tuesday.getOption(Sample(Tuesday()))) // Some(Tuesday()) println(_tuesday.getMaybe(Sample(Monday()))) // Empty() println(_tuesday.getMaybe(Sample(Tuesday()))) // Just(Tuesday()) println(Sample(Tuesday()).day) println("Hello, world!") } }
www.slideshare.net
- コミッター曰く「失敗を表現できるようになったLens」
- もとはPrism[S,A]でPrism[入力,出力]という本当に雑な理解(I/Oだと激しく乱暴な表現なので、せめてSouceとDestinationみたいな表現が適切だろうか。適切な表現があったらば教えて下さい)
- 今回はcase文だけど、Maybe.fromTryCatchNonFatalとかも使えると思う
- Prism→パターンマッチ→戻り値の順番にブロックが形成される
- 途中で気づいたけど、使い方としてはcollectの超拡大版みたいな理解
Prism[S, A] { // パターンマッチ 失敗パターンもここで書ける } { v => // マッチしたものをコネコネする }