読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

Monocleを使ったPrismメモ

Scala

びっくりするほど雑なサンプルですわ。

Monocle documentation - Prism

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 => 
   // マッチしたものをコネコネする
}