为什么Idris将值名称与随后定义的类型参数名称合并?
Haskell允许:为什么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 =
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
执行类似的操作,并警告您