2015-02-23 9 views
9

Attualmente sto imparando Scala, e voleva replicare questo Haskell algebrica tipo di dati:È possibile utilizzare `caso caso` con un parametro di tipo?

data Tree = Empty 
      | Leaf Int 
      | Node Tree Tree 

Questo è quello che mi è venuta in Scala:

sealed trait Tree[T] 
case class Empty[T]() extends Tree[T] 
case class Leaf[T](value: T) extends Tree[T] 
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T] 

Tuttavia, qualcuno mi ha detto che ho dovrebbe usare un case object per Empty, che suppongo sia vero dal momento che non accetta parametri - ma di nuovo richiede un parametro di tipo.

Ho provato quanto segue ma nessuno di loro compilazione:

case object Empty[T] extends Tree[T] 
case object Empty extends Tree[T] 
case object Empty extends Tree 

quindi mi chiedo se c'è un modo per utilizzare case object in questo caso o no.

+6

Un singleton non può avere un parametro di tipo. Forse vuoi 'oggetto Case Empty extends Tree [Nothing]' –

+3

'case object Empty extends Tree [Nothing]', poiché 'Nothing' è un sottotipo di ogni altro tipo. –

+0

Grazie per i commenti esplicativi! –

risposta

12

Un singleton non può essere generico perché ce n'è solo uno. Se si desidera Tree essere covariante (cioè Tree[Int] è un sottotipo di Tree[Any]), allora è possibile definire i tipi come

sealed trait Tree[+T] 
case object Empty extends Tree[Nothing] 

In caso contrario, lasciarlo come una classe case.

+3

Forse collega l'esempio paradigmatico. https://github.com/scala/scala/blob/v2.11.5/src/library/scala/Option.scala#L345 –

Problemi correlati