在编译时建立具有特定价值的Foo列表

时间:2016-12-09 14:54:54

标签: scala

假设:

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类型可能有用,但我实际上并不了解它。

注意 - 对于这个问题,我对使用EitherOption的答案感兴趣。

1 个答案:

答案 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,但这超出了我的能力。