jor*_*an3 7 functional-programming scala hlist shapeless
我想了解Shapeless,我遇到了这个:
// 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
}
Run Code Online (Sandbox Code Playgroud)
_0
是一个特殊而独特的案例,就像Nil
一个List
._0
没有前任.为什么它不是一个对象/案例对象(单例)? HList
似乎这样做:
// `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
Run Code Online (Sandbox Code Playgroud)
(只是猜测,我不知道最初的原因。)
也许这样一个类型 _0
就可用了(像 in 一样显式传递它def fun[N <: Nat] = ???; fun[_0]
,或者更简单地定义关于该类型的隐式)。
如果_0
是单例,则只有类型_0.type
可用。
同样的事情HNil
?