Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Int=>;选项[Nat]?_Scala_Shapeless - Fatal编程技术网

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]
对您没有任何用处。我建议您尝试以不同的方式构建您的问题。