我正在尝试使用slice'
中的Data.Vector.Sized
函数,但是它想要{{1}中的起始位置和 length }格式,而不是简单的Proxy n
。我知道两个数字都是Integer
形式。我如何将它们转换为Integer
格式以使用此功能?
答案 0 :(得分:4)
通常,您不能。 n
约束的含义是Integer
是类型级自然数,其值在编译时是已知的。 Data.Vector.Sized
表示在 runtime 时已知的整数值,并且可能受运行时可能未知的各种因素(例如用户输入,随机性,文件系统,访问数据库,从文件系统读取等等)。
Integer
的目的是执行编译时边界检查,这当然要在编译时不了解大小的情况下才能完成。一旦有了Nat
,就无法将其神奇地转换为Nat
,因为这将需要在编译时确定最终在运行时将具有的值,而实际上甚至可能并非总是如此每次都是相同的值。
根据您要执行的操作,可能会有多种方式对您想要的内容进行编码。例如,您可以使用packFinite
之类的东西在运行时产生一些证据,证明整数在给定范围内,并且您可以使用knownLength
对未知大小的向量运行计算,但都不其中确实可以让您从Integer
魔术Integer
,他们只是说服他们键入系统,以确保在您的container_type_holder
实际超出范围的情况下,您已经执行了适当的运行时检查你答应了。