Int => 选项[Nat]?

Int => Option[Nat]?

Shapeless 中是否存在 Int => Option[Nat] 函数?

其类型签名:

intToOptionNat(a: Int): Option[Nat] = ???

示例:

intToOptionNat(5)   == Some( Nat(5) )
intToOptionNat(-42) == None

我认为您正在寻找的是一个函数,它将 Int 转换为相应的 Nat 子类型,其形式为 _0Succ[_0], Succ[Succ[_0]]

因为我们通常想在一些后续的类型级别计算中利用结果 Nat 子类型的结构,这是需要在编译时静态知道的东西。因此 Int 类型不够精确……我们需要一个 Int 单例类型。这些在 Scala 中不能 (yet) 直接表达,但是 shapeless 提供了一个基于宏的隐式转换,用于从 Int 文字计算 Nat

scala> import shapeless.syntax.nat._
import shapeless.syntax.nat._

scala> def intToNat(n: Nat): n.type = n
intToNat: (n: shapeless.Nat)n.type

因为这是静态计算的,所以不需要将结果类型包装在 Option 中......如果参数文字没有 Nat 表示,它将是一个编译时间错误,

scala> intToNat(5)
res0: Succ[Succ[Succ[Succ[Succ[_0]]]]] = Succ()

scala> intToNat(-42)
<console>:19: error: Expression -42 does not evaluate to a non-negative Int literal
       intToNat(-42)
                 ^