Tagged Types in Shapeless

Shapeless adds support for type tagging via the shapeless.tag module.

build.sbt:

libraryDependencies ++= "com.chuusai" %% "shapeless" % "2.3.3"

search.scala:

import shapeless.tag
import shapeless.tag.@@

trait Needle
trait Haystack

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

object Main extends App {

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

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