2014-06-10 9 views
7

Próbuję zrozumieć bezkształtne, i natknąłem się na to:Dlaczego _0 Nat w Shapeless to klasa zamiast obiektu?

// Base trait for type level natural numbers. 
trait Nat { 
    type N <: Nat 
} 

// Encoding of successor. 
case class Succ[P <: Nat]() extends Nat { 
    type N = Succ[P] 
} 

// Encoding of zero. 
class _0 extends Nat { 
    type N = _0 
} 

_0 jest wyjątkowy i jedyny przypadek, jak Nil dla List. _0 nie ma poprzednika. Dlaczego nie jest obiektem obiektu/przypadku (który jest singletonem)? HList s wydaje się to zrobić:

// `HList` ADT base trait. 
sealed trait HList 

// Non-empty `HList` element type. 
final case class ::[+H, +T <: HList](head : H, tail : T) extends HList { 
    override def toString = head+" :: "+tail.toString 
} 

// Empty `HList` element type. 
sealed trait HNil extends HList { 
    def ::[H](h : H) = shapeless.::(h, this) 
    override def toString = "HNil" 
} 

// Empty `HList` value. 
case object HNil extends HNil 

Odpowiedz

0

(tylko zgadywać, nie wiem, oryginalny powód.)

Może i tak, że typ_0 jest dostępny (aby przekazać je wyraźnie jak w def fun[N <: Nat] = ???; fun[_0] lub po prostu zdefiniować implikacje tego typu).

Jeśli _0 byłby singletonem, dostępny byłby tylko typ _0.type.

To samo dotyczy HNil?

+1

To nie jest dobry powód, aby nie robić tego typu singleton. Aby mieć wygodę, o której mówisz, możesz po prostu napisać 'obiekt sprawy _0 Rozszerza Nat' i' typ _0 = _0.type' – laughedelic

Powiązane problemy