Idris能否推断出顶级常数类型的指数?

时间:2017-10-02 15:06:16

标签: type-inference agda idris

例如,Agda允许我写这个:

open import Data.Vec
open import Data.Nat

myVec : Vec ℕ _
myVec = 0 ∷ 1 ∷ 2 ∷ 3 ∷ []

myVec将按预期使用Vec ℕ 4类型。

但如果我在伊德里斯尝试同样的事情:

import Data.Vect

myVec : Vect _ Nat
myVec = [0, 1, 2, 3]

我收到来自typechecker的错误消息:

 When checking right hand side of myVec with expected type
         Vect len Nat

 Type mismatch between
         Vect 4 Nat (Type of [0, 1, 2, 3])
 and
         Vect len Nat (Expected type)

 Specifically:
         Type mismatch between
                 4
         and
                 len

有没有办法在Idris中定义myVec而无需手动指定Vect的索引?

1 个答案:

答案 0 :(得分:1)

根据评论,伊德里斯的顶级漏洞被普遍量化,而不是通过术语推断填补。

我相信(但是,最终有人来自开发团队必须确认/否认)这部分是为了鼓励显式类型,因此是类型导向的开发,并且部分地为了获得一个很好的语法 - 接口实现中的关注值,如:

Uninhabited v => Uninhabited (_, v) where
    uninhabited (_, void) = uninhabited void

这种无需使用的下划线是从模式中使用的,而不是在表达式中使用。

对于类似这样的东西(它不是你想要的,但它对常量的变化是强大的),你可以使用一个显式的存在:

fst : DPair t _ -> t
fst (x ** _) = x

snd : (s : DPair _ p) -> p (fst s)
snd (_ ** prf) = prf

myVecEx : (n ** Vect n Nat)
myVecEx = (_ ** [0, 1, 2, 3])

myVec : Vect (fst myVecEx) Nat
myVec = snd myVecEx

fstsnd可能在不同名称的标准库中,但我没有在快速搜索中找到。