为什么Idris将值名称与随后定义的类型参数名称合并?

为什么Idris将值名称与随后定义的类型参数名称合并?,idris,Idris,Haskell允许: a:: Int a = 3 data MyList a = Nil | Cons a (MyList a) 而Idris将投诉a被绑定为隐式, 我需要使用不同类型的参数: a: Int a = 3 data MyList b = Nil | Cons b (MyList b) 实际上,Idris并没有在这里将它们合并,因为a是小写。但它可以——而不是Haskell——因为它支持类型中的值。因此编译器会警告您,因为这是常见的错误源。假设你写: n : Nat n =

Haskell允许:

a:: Int 
a = 3
data MyList a = Nil | Cons a (MyList a) 
而Idris将投诉
a被绑定为隐式
,
我需要使用不同类型的参数:

a: Int 
a = 3
data MyList b = Nil | Cons b (MyList b)

实际上,Idris并没有在这里将它们合并,因为
a
是小写。但它可以——而不是Haskell——因为它支持类型中的值。因此编译器会警告您,因为这是常见的错误源。假设你写:

n : Nat
n = 3

doNothing : Vect n Int -> Vect n Int
doNothing xs = xs
您可能认为
doNothing
的类型是
vect3int->vect3int
。但是与之相反,
doNothing
的类型实际上是
{n:Nat}->Vect n Int->Vect n Int
,尽管前面声明了
n
。您必须编写
Vect Main.n Int
或使
n
大写才能使用它

因此,编译器认为您可能想对
MyList a
中的
a
执行类似的操作,并警告您