统一len和S len会带来无限的价值

时间:2017-08-18 19:31:15

标签: type-inference dependent-type idris

我正在尝试创建一个函数hpure,它通过重复相同的元素直到达到所需的长度来生成一个hvect。每个元素可以具有不同的类型。例如:如果参数显示,则每个元素都是show函数的特化。

hpure show : HVect [Int -> String, String -> String, SomeRandomShowableType ->  String]

这是我的尝试:

hpure : {outs : Vect k Type} -> ({a : _} -> {auto p : Elem a outs} -> a) -> HVect outs
hpure {outs = []} _ = []
hpure {outs = _ :: _ } v = v :: hpure v

最终v:

发生此错误
When checking an application of Main.hpure:
        Unifying len and S len would lead to infinite value

为什么会出现错误以及如何解决?

1 个答案:

答案 0 :(得分:5)

问题是v的类型取决于outs,而对hpure的递归调用则会传递outs的尾部。所以v也需要调整。

错误基本上是说outs及其尾部的长度必须相同才能使您的版本成为类型检查。

这是一个强调版本的版本。

hpure : {outs : Vect k Type} -> ({a : Type} -> {auto p : Elem a outs} -> a) -> HVect outs
hpure {outs = []} _ = []
hpure {outs = _ :: _} v = v Here :: hpure (\p => v (There p))