Back to Fpinscala

09.Answer

answerkey/monoids/09.answer.md

latest559 B
Original Source
scala
opaque type Interval = (Int, Int)

val orderedMonoid: Monoid[(Boolean, Option[Interval])] = new:
  def combine(a1: (Boolean, Option[Interval]), a2: (Boolean, Option[Interval])) =
    (a1(1), a2(1)) match
      case (Some((leftMin, leftMax)), Some((rightMin, rightMax))) =>
        (a1(0) && a2(0) && leftMax <= rightMin, Some((leftMin, rightMax)))
      case _ =>
        (a1(0) && a2(0), a1(1).orElse(a2(1)))
  val empty = (true, None)

def ordered(ints: IndexedSeq[Int]): Boolean =
  foldMapV(ints, orderedMonoid)(i => (true, Some((i, i))))(0)