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

时间:2018-05-06 23:23:05

标签: idris

Haskell允许:

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

而伊德里斯会抱怨a is bound as an implicit, 我需要使用不同类型的参数:

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

1 个答案:

答案 0 :(得分:6)

实际上,Idris并没有将它们混为一谈,因为n : Nat n = 3 doNothing : Vect n Int -> Vect n Int doNothing xs = xs 是小写的。但它可以 - 除了Haskell - 因为它支持类型中的值。所以编译器警告你,因为这是错误的常见来源。假设你写:

doNothing

您可能希望Vect 3 Int -> Vect 3 Int的类型为doNothing。但是,lower case arguments are bound to be implicit{n : Nat} -> Vect n Int -> Vect n Int的类型实际上是n,尽管之前声明了Vect Main.n Int。您必须编写N或使a大写才能使用它。

因此,编译器认为您可能希望在MyList a中执行与true类似的操作并发出警告。