为什么不shapeless.Nat有一个方法来在运行时访问它的值?

时间:2017-02-02 23:52:57

标签: scala shapeless

这是一个示例程序,要求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打开公关?

1 个答案:

答案 0 :(得分:3)

目的是使用Nat类型主要是幻像,并通过类型推断和隐式解析影响类型检查和计算。在这种情况下,不需要任何运行时代表,并且将浪费所需的额外存储。在需要运行时表示的情况下,ToInt类型类可以提供它,尽管显然有更多的仪式而不是内在的toInt方法。

总而言之,这是&#34;设计&#34;:事情本来可以做得不同,但它们是按照预期的。