Tagged Types in Scalaz

Scalaz adds support for unboxed tagged types via the scalaz.Tag module.

build.sbt:

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.8"

search.scala:

import scalaz._
import Tag._

trait Needle
trait Haystack

object Search {
  def apply(n: String @@ Needle, h: String @@ Haystack): Boolean =
    unwrap(h) contains unwrap(n)
}

object Main extends App {

  val n = Tag[String,Needle]("needle")
  val h = Tag[String,Haystack]("This haystack is nothing but needles!")

  println(Search(n, h))
}
$ sbt run
true