5日目 

Derived from Bello Nock's Sky Walk by Chris Phutully

4日目は Semigroup と Monoid をみて、 独自のモノイドを実装した。あとは、foldMap などができる Foldable も少しかじった。

Apply.ap 

今日は、更新のお知らせから。まず、3日目にみた Apply.apply だけど、 Apply.ap に改名された (戻ったとも言えるが)。 #308

Serializable な型クラスインスタンス 

次に、モノイドの法則検査を値クラスに対して行った時に Serializable 関連で失敗していたのを覚えているだろうか。 これは、実は Cats のせいじゃないらしいことが分かった。Cats の gitter に行った所、Erik (@d6/@non) が親切に僕の型クラスインスタンスが serializable じゃないのは REPL から定義されているせいだと教えてもらった。 Firstsrc/ 以下で定義した所、法則は普通に合格した:

scala> import cats._, cats.data._, cats.implicits._
import cats._
import cats.data._
import cats.implicits._

scala> import algebra.laws.GroupLaws
import algebra.laws.GroupLaws

scala> import org.scalacheck.{ Arbitrary, Gen }
import org.scalacheck.{Arbitrary, Gen}

scala> import example.First
import example.First

scala> implicit def arbFirst[A: Eq](implicit ev: Arbitrary[Option[A]]): Arbitrary[First[A]] =
     |          Arbitrary { ev.arbitrary map { First(_) } }
arbFirst: [A](implicit evidence$1: cats.Eq[A], implicit ev: org.scalacheck.Arbitrary[Option[A]])org.scalacheck.Arbitrary[example.First[A]]

scala> val rs = GroupLaws[First[Int]].monoid
rs: algebra.laws.GroupLaws[example.First[Int]]#GroupProperties = algebra.laws.GroupLaws$GroupProperties@77fac6ab

scala> rs.all.check
+ monoid.associativity: OK, passed 100 tests.
+ monoid.combineAll(Nil) == id: OK, passed 100 tests.
+ monoid.combineN(a, 0) == id: OK, passed 100 tests.
+ monoid.combineN(a, 1) == a: OK, passed 100 tests.
+ monoid.combineN(a, 2) == a |+| a: OK, passed 100 tests.
+ monoid.isEmpty: OK, passed 100 tests.
+ monoid.leftIdentity: OK, passed 100 tests.
+ monoid.rightIdentity: OK, passed 100 tests.
+ monoid.serializable: OK, proved property.

Jason Zaugg (@retronym) さんの指摘によると、分散処理時に受送信両者の Cats のバージョンが完全に一致するとき以外でのシリアライゼーションをサポートするには、さらに:

など他にも気をつけることがあるということだった。

Contents