在Haskell中,如何将Integer转换为n等于整数的代理(n :: KnownNat)?

时间:2018-08-03 20:52:55

标签: haskell vector proxy

我正在尝试使用slice'中的Data.Vector.Sized函数,但是它想要{{1}中的起始位置 length }格式,而不是简单的Proxy n。我知道两个数字都是Integer形式。我如何将它们转换为Integer格式以使用此功能?

1 个答案:

答案 0 :(得分:4)

通常,您不能。 n约束的含义是Integer是类型级自然数,其值在编译时是已知的Data.Vector.Sized表示在 runtime 时已知的整数值,并且可能受运行时可能未知的各种因素(例如用户输入,随机性,文件系统,访问数据库,从文件系统读取等等)。

Integer的目的是执行编译时边界检查,这当然要在编译时不了解大小的情况下才能完成。一旦有了Nat,就无法将其神奇地转换为Nat,因为这将需要在编译时确定最终在运行时将具有的值,而实际上甚至可能并非总是如此每次都是相同的值。

根据您要执行的操作,可能会有多种方式对您想要的内容进行编码。例如,您可以使用packFinite之类的东西在运行时产生一些证据,证明整数在给定范围内,并且您可以使用knownLength对未知大小的向量运行计算,但都不其中确实可以让您从Integer魔术Integer,他们只是说服他们键入系统,以确保在您的container_type_holder实际超出范围的情况下,您已经执行了适当的运行时检查你答应了。