gpt4 book ai didi

scala - 为什么 shapeless.Nat 没有在运行时访问其值的方法?

转载 作者:行者123 更新时间:2023-12-01 23:40:39 28 4
gpt4 key购买 nike

这是一个示例程序,它要求 shapeless.Nat 能够在运行时产生它的值,即使它的值在 comile 时间是未知的:

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 的运行时值的情况下编译和工作?

我错过了什么或者我应该为 Shapeless 打开一个 PR?

最佳答案

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

总而言之,这是“设计使然”:事情本可以以不同的方式完成,但它们都符合预期。

关于scala - 为什么 shapeless.Nat 没有在运行时访问其值的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42014497/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com