为什么不使用 Elem 进行类型检查?

Why doesn't this use of Elem typecheck?

我很困惑。

module Experiment

import Data.Vect

p1: Elem 5 [3,4,5,6]
p1 = There (There Here)

v : Vect 4 Int
v = 3 :: 4 :: 5 :: 6 :: Nil

p2: Elem 5 v
p2 = There (There Here)

p2 的定义没有类型检查,而 p1 的定义有。我正在使用 Idris 0.10.2。有什么我想念的吗?

类型声明中的小写名称被解释为隐式参数(如 length : List a -> Nat 中的 a 实际上是 length : {a : Type} -> List a -> Nat)。要引用定义的 Vect,您可以使用大写名称或通过命名空间引用:

module Experiment

import Data.Vect

A : Vect 4 Int
A = 3 :: 4 :: 5 :: 6 :: Nil

p2: Elem 5 A
p2 = There (There Here)

a : Vect 4 Int
a = 3 :: 4 :: 5 :: 6 :: Nil

p3: Elem 5 Experiment.a
p3 = There (There Here)