例如,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
的索引?
答案 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
fst
和snd
可能在不同名称的标准库中,但我没有在快速搜索中找到。