Skip to content

Instantly share code, notes, and snippets.

@takungsk
Created September 5, 2012 04:41
Show Gist options
  • Save takungsk/3630590 to your computer and use it in GitHub Desktop.
Save takungsk/3630590 to your computer and use it in GitHub Desktop.
Scalaz Monoid の実験

Scalaz Monoid + Equalの実験

Monoidのインスタンスとする前

検証

scala> Vector(1,2) == Vector(1,2)
res0: Boolean = true

こちらは通常の比較なので問題なし。

scala> Vector(1,2) === Vector(1,2)
<console>:14: error: could not find implicit value for parameter F0: scalaz.Equa
l[scala.collection.immutable.Vector[Int]]
              Vector(1,2) === Vector(1,2)
                    ^

エラーとなりました。

scala> Vector(1,2) =/= Vector(1,2)
<console>:14: error: could not find implicit value for parameter F0: scalaz.Equa
l[scala.collection.immutable.Vector[Int]]
              Vector(1,2) =/= Vector(1,2)
                    ^

こちらもエラーとなりました。

scala> mzero[Vector[Int]]
<console>:14: error: could not find implicit value for parameter F: scalaz.Monoi
d[Vector[Int]]
              mzero[Vector[Int]]
               ^

mzeroもエラーとなります。

Monoid のインスタンス化

こんなコードを定義しました

object vector {
  implicit object VectorInstance extends Monoid[Vector[Int]] with Equal[Vector[Int]] {
    def zero = Vector[Int]()
    def append(v1: Vector[Int], v2: => Vector[Int]) = v1 ++ v2
    def equal(v1:Vector[Int], v2:Vector[Int]) = v1 == v2
  }
}

スクリプトをロードします。

scala> :load script\vectorMonoid.scala
Loading script\vectorMonoid.scala...
defined module vector

scala> import vector._
import vector._

いざ実験

scala> Vector(1,2) == Vector(1,2)
res4: Boolean = true

scala> Vector(1,2) === Vector(1,2)
res5: Boolean = true

scala> Vector(1,2) =/= Vector(1,2)
res6: Boolean = false

scala> mzero[Vector[Int]]
res7: Vector[Int] = Vector()

scala> Vector(1,2) |+| Vector(1,2)
res8: scala.collection.immutable.Vector[Int] = Vector(1, 2, 1, 2)
object vector {
  implicit def vectorMonoid[A]: Monoid[Vector[A]] = new Monoid[Vector[A]] {
    def append(f1: Vector[A], f2: => Vector[A]) = f1 ++ f2
    def zero: Vector[A] = Vector[A]()
  }

  implicit def VectorShow[A] = new Show[Vector[A]] {
    override def show(p: Vector[A]) = Cord(p.toString)
  }
}
@takungsk
Copy link
Author

takungsk commented Sep 6, 2012

以下のコードでも試した

object vector {
  implicit def vectorMonoid[A]: Monoid[Vector[A]] = new Monoid[Vector[A]] {
    def append(f1: Vector[A], f2: => Vector[A]) = f1 ++ f2
    def zero: Vector[A] = Vector[A]()
  }

  implicit def VectorShow[A] = new Show[Vector[A]] {
    override def show(p: Vector[A]) = Cord(p.toString)
  }
}

@takungsk
Copy link
Author

takungsk commented Sep 6, 2012

以下のコードも試した

object vector {
implicit def vectorMonoid[A]: Monoid[Vector[A]] = new Monoid[Vector[A]] {
def append(f1: Vector[A], f2: => Vector[A]) = f1 ++ f2
def zero: Vector[A] = VectorA
}

  implicit def VectorShow[A] = new Show[Vector[A]] {
    override def show(p: Vector[A]) = Cord(p.toString)
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment