bistaumanga
bistaumanga

Reputation: 1496

scala: Parameterize by Type Union

I needed a type Union to force restriction on types, So as per answer in here, I defined my Union as:

sealed trait Value[T]
object Value{
  implicit object NumberWitness extends Value[Int]
  implicit object StringWitness extends Value[String]
}

Now, How do i create a list or class parameterized by this type union? Is it possible to do so?? I tried following syntax in repl, but without any luck:

scala> import Value._
import Value._

scala> def list[V: Value] = List("hello", 1)
list: [V](implicit evidence$1: Value[V])List[Any]

scala> list
<console>:18: error: ambiguous implicit values:
 both object NumberWitness in object Value of type Value.NumberWitness.type
 and object StringWitness in object Value of type Value.StringWitness.type
 match expected type Value[V]
       list
       ^

Or Is it possible to do so with advanced FP libraries like scalaz or cats??

Upvotes: 0

Views: 288

Answers (1)

Alexey Romanov
Alexey Romanov

Reputation: 170919

This is called type class, not type union. And they are intended to allow you to write methods which work either with Int or with String, e.g.

def listOfValues[V: Value](x: V) = List(x)
listOfValues(1) // works
listOfValues("") // works
listOfValues(0.0) // doesn't work
listOfValues(1, "") // doesn't work

not to allow mixing different types.

You can do it using existential types, e.g.

case class WithValue[V: Value](x: V)
object WithValue {
  implicit def withValue[V: Value](x: V) = WithValue(x)
}

def list = List[WithValue[_]]("hello", 1)

but I would not recommend actually doing that. There is quite likely a better way to solve your problem.

In particular, consider using simply

// not sealed if you need to add other types elsewhere
// can be Value[T] instead
sealed trait Value 
case class IntValue(x: Int) extends Value
case class StringValue(x: Int) extends Value

// add implicit conversions to IntValue and StringValue if desired
List(StringValue("hello"), IntValue(1))

Upvotes: 2

Related Questions