21

Idris 是否在向量引擎下进行了任何类型的优化?因为从外观上看,Idris 向量只是一个已知大小(在编译时已知)的链表。事实上,一般来说,您似乎可以表达以下等价(我在语法上猜测了一下):

Vector : Nat -> Type -> Type
Vector n t = (l: List t ** length l = n)

因此,虽然这在防止范围错误的意义上很好,但向量的真正优势(在该术语的传统用法中)是在性能方面;特别是 O(1) 随机访问。似乎 idris 向量不支持这一点(你将如何编写索引函数来获得这种性能?)。

  • 假设引擎盖下没有魔法(就像 发生的那样Nat)来重新配置Vectors,Idris 中是否存在随机访问数据类型?
  • 在代数类型系统中如何定义这样的东西?当然,似乎不可能归纳地定义它。
  • 在像 Idris 这样的类型系统中,是否有可能创建一个支持 O(1) 随机访问的数据类型,并且知道它的长度以便所有访问都可以证明是有效的?(Haskell 有数组样式的向量,但它们的具体实现对普通用户来说是不透明的,包括我在内)
4

2 回答 2

16

它对优化向量查找没有任何作用(至少在撰写此答案时)。

实际上,这并不是因为这样做有任何困难,而是因为我宁愿有某种通用框架来编写这种优化,而不是对它们进行硬编码。诚然,我们已经对Nat.

根据您实际想要它的用途,实验性的唯一性类型系统可能会有所帮助,因为您可以在底层拥有一个低级别的可变事物,并且仍然可以安全有效地访问和更新高级中的纯样式水平语言。走着瞧...

于 2014-12-24T11:15:41.113 回答
3

Edwin 对 Idris 目前所做的事情有明确的答案。 但是,如果您正在寻找在某些情况下可能很自然地优化为恒定时间查找的东西,那么以下可能是朝着正确方向迈出的一步。

对于编译时固定大小的向量(即,不在 lambda 下,不在顶层由长度参数化),以下结构为您提供向量和查找函数,对于任何固定的具体长度,可以在编译时规范化为应该可以直接优化为常数时间函数的函数。(抱歉,代码在 Coq 中;我目前没有 Idris 的工作版本,也不太了解。如果有人建议正确的语法,我很乐意用 Idris 代码替换它,例如,在一条评论。)

Fixpoint vector (n : nat) (A : Type) :=
  match n return Type with
    | 0 => unit
    | S n' => (A * vector n' A)%type
  end.
Definition nil {A} : vector 0 A := tt.
Definition cons {n} {A : Prop} (x : A) (xs : vector n A) : vector (S n) A
  := (x, xs).
Fixpoint get {n} {A : Prop} (m : nat) (default : A) (v : vector n A) {struct n} : A
  := match n as n return vector n A -> A with
       | 0 => fun _ => default
       | S n' => match m with
                   | 0 => fun v => fst v
                   | S m' => fun v => @get n' A m' default (snd v)
                 end
     end v.

这个想法是,对于任何固定的n,正常形式的get是非递归的,因此编译器可以假设将其编译成一个函数,其运行时独立于n恰好是什么。

于 2015-01-01T11:09:25.400 回答