2014-06-10 17 views
7

Biçimsiz anlamaya çalışıyorum ve bu geldi:Neden _0 Nat in Shapeless nesnesi yerine bir sınıf mıdır?

// 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 bir List için Nil gibi özel ve eşsiz bir durum vardır. _0'un önceliği yoktur. Neden bir nesne/olgu nesnesi değil (singleton)? HList s bunu görünmektedir:

// `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 

cevap

0

(Sadece tahmin, ben orijinal nedenini bilmiyorum.) Belki

_0 kullanılabilir bir tipi (def fun[N <: Nat] = ???; fun[_0] gibi açıkça geçmek böylece veya daha fazla basitçe bu türle ilgili hükümleri tanımlamak için).

_0 tekil olarak yapılmışsa, yalnızca _0.type tipi kullanılabilir olur. Ayrıca HNil için de aynı şey nedir?

+1

Tek bir satır türü yapmamak için iyi bir neden değil. Bahsettiğiniz rahatlığa sahip olmak için, 'case object _0 Extends Nat' yazıp '_0 = _0.type' yazabilirsiniz. – laughedelic