Int => 选项[Nat]?
Int => Option[Nat]?
Shapeless 中是否存在 Int => Option[Nat]
函数?
其类型签名:
intToOptionNat(a: Int): Option[Nat] = ???
示例:
intToOptionNat(5) == Some( Nat(5) )
intToOptionNat(-42) == None
我认为您正在寻找的是一个函数,它将 Int
转换为相应的 Nat
子类型,其形式为 _0
,Succ[_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)
^
Shapeless 中是否存在 Int => Option[Nat]
函数?
其类型签名:
intToOptionNat(a: Int): Option[Nat] = ???
示例:
intToOptionNat(5) == Some( Nat(5) )
intToOptionNat(-42) == None
我认为您正在寻找的是一个函数,它将 Int
转换为相应的 Nat
子类型,其形式为 _0
,Succ[_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)
^