假设:
case class Foo(x: BigDecimal)
我希望在编译时构建一个List[Foo]
,其中每个Foo
的BigDecimal值必须为5
。
因此,我希望编译以下代码:
type Foo5Only = ???
val foos5: List[Foo5Only] = List(Foo(5), Foo(5))
但是,我希望以下内容无法编译:
val bad: List[Foo5Only] = List(Foo(42))
我猜测shapeless
Singleton类型可能有用,但我实际上并不了解它。
注意 - 对于这个问题,我对使用Either
或Option
的答案感兴趣。
答案 0 :(得分:1)
以及使用无形' pte = get_locked_pte(mm, addr, &ptl);
entry = *pte;
entry = pte_clear_flags(entry, _PAGE_PRESENT);
set_pte_at(mm, addr, pte, entry);
pte_unmap_unlock(pte, ptl);
flush_tlb_range(vma, vma->vm_start, vma->vm_end);
类型您也可以使用单例类型。不幸的是,Scala的内置List类型具有协方差,这会影响类型安全,但使用简单的手工制作列表类型似乎有效:
Nat
你可以用一些宏观魔法来消除import shapeless.syntax.singleton._
sealed trait Lst[T]
case class Nil[T]() extends Lst[T]
case class Cons[T](head : T, tail : Lst[T]) extends Lst[T]
def list[T](t : T) : Lst[T] = {
Cons(t, Nil())
}
// OK
val foos5 = Cons(5.narrow, list(5.narrow))
// Compile-time type mismatch error.
val foos6 = Cons(42.narrow, list(5.narrow))
s,但这超出了我的能力。