这是一个示例程序,要求case class Command[N <: Nat](name: String, args: Sized[List[String], N])
case class InvokeCommand[N <: Nat, A](ref: Command[N], args: Sized[List[A], N])
object Program {
val commands: List[Command[Nat]] = List(
Command("foo", Sized("t", "r", "f")),
Command("bar", Sized("h", "i")))
def callCommand[A](name: String, args: List[A]): Option[InvokeCommand] = {
val command = commands.find(_.name ≟ name)
args.sized(command.args.size).map(InvokeCommand(command, _))
}
}
能够在运行时生成其值,即使它的值在编译时是未知的:
shapeless.Nat
这仍然会产生一个程序,它具有比没有使用Sized
时更多的静态类型保证。此程序假定size
有一个shapeless.Nat
方法返回shapeless.Nat
,但实际情况并非如此。
所以我的问题是为什么toInt
没有sized
方法(也很容易实现),它允许新版本的N
方法进行编译和工作在这种情况下,在编译时不知道function notFloating (params){
return !params.node.floating
}
的运行时值?
我缺少什么,或者我应该为Shapeless打开公关?
答案 0 :(得分:3)
目的是使用Nat
类型主要是幻像,并通过类型推断和隐式解析影响类型检查和计算。在这种情况下,不需要任何运行时代表,并且将浪费所需的额外存储。在需要运行时表示的情况下,ToInt
类型类可以提供它,尽管显然有更多的仪式而不是内在的toInt
方法。
总而言之,这是&#34;设计&#34;:事情本来可以做得不同,但它们是按照预期的。