2015-02-23 8 views
9

Jestem obecnie nauki Scala i chciał powtórzyć ten Haskell algebraicznych Typ danych:Czy można użyć `obiektu sprawy` z parametrem typu?

data Tree = Empty 
      | Leaf Int 
      | Node Tree Tree 

To właśnie wpadł w 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] 

jednak ktoś powiedział mi, że powinien używać case object dla Empty, co moim zdaniem jest prawdziwe, ponieważ nie pobiera parametrów - ale potem znowu wymaga parametru typu.

Próbowałem następujących ale żaden z nich nie kompilacji:

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

Więc zastanawiam się, czy istnieje sposób, aby wykorzystać case object w tym przypadku, czy nie.

+6

Singleton nie może mieć parametru typu. Może chcesz 'obiekt sprawy Pusty rozszerza Drzewo [Nothing]' –

+3

'case object Pusty rozszerza Drzewo [Nothing]', ponieważ 'Nothing' jest podtypem każdego innego typu. –

+0

Dziękuję za wyjaśnienia! –

Odpowiedz

12

Singleton nie może być ogólny, ponieważ jest tylko jeden z nich. Jeśli chcesz Tree być kowariantna (tj Tree[Int] jest podtypem Tree[Any]), można zdefiniować typy jak

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

W przeciwnym razie pozostaw je jako klasy sprawy.

+3

Może połączyć paradygmatyczny przykład. https://github.com/scala/scala/blob/v2.11.5/src/library/scala/Option.scala#L345 –

Powiązane problemy