Scala Int=>;选项[Nat]?
Scala Int=>;选项[Nat]?,scala,shapeless,Scala,Shapeless,Int=>Option[Nat]函数是否存在于Shapeless中 其类型签名: intToOptionNat(a: Int): Option[Nat] = ??? 示例: intToOptionNat(5) == Some( Nat(5) ) intToOptionNat(-42) == None 我认为您正在寻找的是一个函数,它将一个Int转换为相应的Nat子类型,其形式为\u 0,Succ[\u 0],Succ[such[\u 0]]等 因为我们通常希望在一些后续的类型级计算中利用
Int=>Option[Nat]
函数是否存在于Shapeless中
其类型签名:
intToOptionNat(a: Int): Option[Nat] = ???
示例:
intToOptionNat(5) == Some( Nat(5) )
intToOptionNat(-42) == None
我认为您正在寻找的是一个函数,它将一个
Int
转换为相应的Nat
子类型,其形式为\u 0
,Succ[\u 0]
,Succ[such[\u 0]]
等
因为我们通常希望在一些后续的类型级计算中利用生成的Nat
子类型的结构,所以在编译时需要静态地了解这一点。因此,类型Int
不够精确。。。我们需要一个Int
singleton类型。它们在Scala中不能()直接表达,但是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
由于这是静态计算的,因此不需要将结果类型包装在选项中。。。如果参数literal没有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)
^
scala>intToNat(5)
res0:Succ[Succ[Succ[Succ[Succ[\u 0]]]]=Succ()
scala>intToNat(-42)
:19:错误:表达式-42的计算结果不是非负整数文字
intToNat(-42)
^
这方面不是100%;这个函数在shapeless中不存在。你可以使用Nat.apply来创建一个函数来实现这一点。Nat
是一个非常无用的类型,如果你只是想检查是否相等,最好换个方向。类似于foo[N好吧,我正计划将这个问题的答案用于。假设我有case class X(N:N)
,其中N
是一个介于0和5之间的Nat
。谢谢你的回答。最终,我正在尝试创建一个JSON阅读器(JSON->a)对于Nat。因此,据我所知,我需要动态构建一个Nat,因此选择[Nat]返回类型。正如@travisbrown在对您的问题的评论中所观察到的,类型选项[Nat]
对您没有任何用处。我建议您尝试以不同的方式构建您的问题。